我是R的新手,我试图根据他们的名字按组加总.我有一个像这样的数据框:
DT <- data.frame(a011=c(0,10,20,0),a012=c(010,10,0,0),a013=c(10,30,0,10),
a021=c(10,20,20,10),a022=c(0,0,0,10),a023=c(20,0,0,0),a031=c(30,0,10,0),
a032=c(0,0,10,0),a033=c(20,0,0,0))
Run Code Online (Sandbox Code Playgroud)
我想获得以"a01"开头的所有列的总和,以"a02"开头的所有列以及以"a03"开头的所有列:
a01tot a02tot a03tot
20 30 50
50 20 0
20 20 20
10 20 0
Run Code Online (Sandbox Code Playgroud)
到目前为止我已经习惯了
DT$a01tot <- rowSums(DT[,grep("a01", names(DT))])
Run Code Online (Sandbox Code Playgroud)
等等,但我的真实数据框有更多的组,我想避免为每个组编写一行代码.我想知道是否可以在矢量或列表中包含"a01","a02","a03"......并且有一些内容可以添加"a01tot","a02tot","a03tot"......数据框自动.
我知道我的问题与这个问题非常相似:不同组列的R总和,以相似的字符串开头,但解决方案指出,
cbind(df, t(rowsum(t(df), sub("_.*", "_t", names(df)))))
Run Code Online (Sandbox Code Playgroud)
在我的情况下不起作用,因为没有要替换的公共元素(如"_")(我无法将变量的名称更改为a01_1,a02_2等).
在我的情况下,切换到"长"格式也不是一个可行的解决方案.
任何帮助将不胜感激.
您可以将模式存储在矢量中并循环遍历它们.在您的示例中,您可以使用以下内容:
patterns <- unique(substr(names(DT), 1, 3)) # store patterns in a vector
new <- sapply(patterns, function(xx) rowSums(DT[,grep(xx, names(DT)), drop=FALSE])) # loop through
# a01 a02 a03
#[1,] 20 30 50
#[2,] 50 20 0
#[3,] 20 20 20
#[4,] 10 20 0
Run Code Online (Sandbox Code Playgroud)
您可以像这样调整名称:
colnames(new) <- paste0(colnames(new), "tot") # rename
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7321 次 |
| 最近记录: |