我在使用 paste0
函数时遇到一个问题。我有一个数据框:
数据:
C C13 H O N
1 1 0 4 0 0
2 2 0 4 0 0
3 3 0 4 0 0
4 4 0 4 0 0
5 5 0 4 1 0
6 1 1 4 1 0
7 2 1 4 1 1
使用
data$formula = paste0("C", data$C, "C13", data$C13, "H", data$H, "O", data$O, "N",data$N)
我得到了公式列
C C13 H O N formula
1 1 0 4 0 0 C1C130H4O0N0
2 2 0 4 0 0 C2C130H4O0N0
3 3 0 4 0 0 C3C130H4O0N0
4 4 0 4 0 0 C4C130H4O0N0
5 5 0 4 1 0 C5C130H4O1N0
6 1 1 4 1 0 C1C131H4O1N0
7 2 1 4 1 1 C2C131H4O1N1
问题是我想要所有值为 0 的字符串,因此对于第 1 行我想要:C1H4
而不是 C1C130H4O0N0
等等。
我对 R 非常陌生,所以我尝试过
data$formula = paste0("C", data$C>0, "C13", data$C13>0, "H", data$H>0, "O", data$O>0, "N",data$N>0)
但这只给我真实的错误输出......
有人可以帮我吗,或者知道如何解决这个问题?
非常感谢!
最佳答案
我想只需一次应用就足够了!
逻辑:首先我们使用 apply(df, 1, ...)
迭代每一行;然后我们使用 which
检查所有条目是否非零;获得索引后,只需对相应的列名和值进行子集
df$formula <- apply(df, 1, function(x){y = which(x!=0)
paste0(colnames(df)[y], x[y], collapse = "")})
# [1] "C1H4" "C2H4" "C3H4" "C4H4" "C5H4O1" "C1C131H4O1" "C2C131H4O1N1"
> df
# C C13 H O N formula
#1 1 0 4 0 0 C1H4
#2 2 0 4 0 0 C2H4
#3 3 0 4 0 0 C3H4
#4 4 0 4 0 0 C4H4
#5 5 0 4 1 0 C5H4O1
#6 1 1 4 1 0 C1C131H4O1
#7 2 1 4 1 1 C2C131H4O1N1
关于r - 当条目本身的值为零且条目之前的条目为 0 时,跳过 Paste0 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771682/