R - 列表元素中所有命名项的总和

问题描述 投票:0回答:2

我正在尝试对

chemical_formula
向量中每个元素的原子数求和:

chemical_formula <- c("CaF2", "Ca3(PO4)2", "FePO4", "KCl", "K3PO4", "K2SO4", "Mg3(PO4)2", "NaCl",
"Na3PO4", "Na2SO4", "SiO2", "CaSO4", "KAsO2", "KBr", "KI", "LiCl", "MnSO4", "CaS", "CuAsHO3",
"AlK(SO4)2", "(H2O)12", "ZnCl2", "CaCO3", "NaHCO3", "AsI3", "AuCl4Na", "Se", "K2Cr2O7")
cell_salts_atoms <- CHNOSZ::makeup(chemical_formula)

# > CHNOSZ::makeup(chemical_formula)
# [[1]]
# Ca  F 
#  1  2 
# 
# [[2]]
# Ca  O  P 
#  3  8  2 
# 
# [[3]]
# Fe  P  O 
#  1  1  4 
# 
# [[4]]
#  K Cl 
#  1  1 
# 
# [[5]]
# K P O 
# 3 1 4 
# 
# [[6]]
# K S O 
# 2 1 4 
# 
# [[7]]
# Mg  O  P 
#  3  8  2 
# 
# [[8]]
# Na Cl 
#  1  1 
# 
# [[9]]
# Na  P  O 
#  3  1  4 
# 
# [[10]]
# Na  S  O 
#  2  1  4 
# 
# [[11]]
# Si  O 
#  1  2 
# 
# [[12]]
# Ca  S  O 
#  1  1  4 
# 
# [[13]]
#  K As  O 
#  1  1  2 
# 
# [[14]]
#  K Br 
#  1  1 
# 
# [[15]]
# K I 
# 1 1 
# 
# [[16]]
# Li Cl 
#  1  1 
# 
# [[17]]
# Mn  S  O 
#  1  1  4
# 
# [[18]]
# Ca  S
#  1  1
# 
# [[19]]
# Cu As  H  O
#  1  1  1  3
# 
# [[20]]
# Al  K  O  S
#  1  1  8  2
# 
# [[21]]
#  H  O
# 24 12
# 
# [[22]]
# Zn Cl
#  1  2
# 
# [[23]]
# Ca  C  O
#  1  1  3
# 
# [[24]]
# Na  H  C  O
#  1  1  1  3
# 
# [[25]]
# As  I
#  1  3
# 
# [[26]]
# Au Cl Na
#  1  4  1
# 
# [[27]]
# Se
#  1
# 
# [[28]]
#  K Cr  O
#  2  2  7
cell_salts_atoms_matrix <- lapply(cell_salts_atoms, as.matrix)

# > cell_salts_atoms_matrix
# [[1]]
#    [,1]
# Ca    1
# F     2
# 
# [[2]]
#    [,1]
# Ca    3
# O     8
# P     2
# 
# [[3]]
#    [,1]
# Fe    1
# P     1
# O     4
# 
# [[4]]
#    [,1]
# K     1
# Cl    1
# 
# [[5]]
#   [,1]
# K    3
# P    1
# O    4
# 
# [[6]]
#   [,1]
# K    2
# S    1
# O    4
# 
# [[7]]
#    [,1]
# Mg    3
# O     8
# P     2
# 
# [[8]]
#    [,1]
# Na    1
# Cl    1
# 
# [[9]]
#    [,1]
# Na    3
# P     1
# O     4
# 
# [[10]]
#    [,1]
# Na    2
# S     1
# O     4
# 
# [[11]]
#    [,1]
# Si    1
# O     2
# 
# [[12]]
#    [,1]
# Ca    1
# S     1
# O     4
# 
# [[13]]
#    [,1]
# K     1
# As    1
# O     2
# 
# [[14]]
#    [,1]
# K     1
# Br    1
# 
# [[15]]
#   [,1]
# K    1
# I    1
# 
# [[16]]
#    [,1]
# Li    1
# Cl    1
# 
# [[17]]
#    [,1]
# Mn    1
# S     1
# O     4
# 
# [[18]]
#    [,1]
# Ca    1
# S     1
# 
# [[19]]
#    [,1]
# Cu    1
# As    1
# H     1
# O     3
# 
# [[20]]
#    [,1]
# Al    1
# K     1
# O     8
# S     2
# 
# [[21]]
#   [,1]
# H   24
# O   12
# 
# [[22]]
#    [,1]
# Zn    1
# Cl    2
# 
# [[23]]
#    [,1]
# Ca    1
# C     1
# O     3
# 
# [[24]]
#    [,1]
# Na    1
# H     1
# C     1
# O     3
# 
# [[25]]
#    [,1]
# As    1
# I     3
# 
# [[26]]
#    [,1]
# Au    1
# Cl    4
# Na    1
# 
# [[27]]
#    [,1]
# Se    1
# 
# [[28]]
#    [,1]
# K     2
# Cr    2
# O     7

我希望结果类似于以下内容:

Se 1
Au 1
As 2
Ca 6

我已经尝试过

cell_salts_atoms_sum <- lapply(cell_salts_atoms, sum)
;但是,这仅提供每个列表元素的总和,而不是每个命名组件的总和。

产生预期结果的最佳方法是什么?

r list matrix sum
2个回答
0
投票

也许是这样的:

library(dplyr)
atoms <- unlist(cell_salts_atoms)
tibble(name = names(atoms), value = atoms) %>% 
  summarise(total_atoms = sum(value), .by = name)

0
投票

一种方法是:

data.table::rbindlist(lapply(cell_salts_atoms, as.list), fill = TRUE) |>
    colSums(na.rm = TRUE)
# Ca  F  O  P Fe  K Cl  S Mg Na Si As Br  I Li Mn Cu  H Al Zn  C Au Se Cr 
#  7  2 84  7  1 12  9  7  3  8  1  3  1  4  1  1  1 26  1  1  2  1  1  2 
© www.soinside.com 2019 - 2024. All rights reserved.