我对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))
我想获得以&#34; a02&#34;开头的所有列的总和,以&#34; a02&#34;开头的所有列。以&#34; a03&#34;:
开头的所有列a01tot a02tot a03tot
20 30 50
50 20 0
20 20 20
10 20 0
到目前为止,我已经使用了
DT$a01tot <- rowSums(DT[,grep("a01", names(DT))])
等等,但我的真实数据框有更多的组,我想避免为每个组编写一行代码。我想知道是否可以在矢量或列表中包含&#34; a01&#34;,&#34; a02&#34;,&#34; a03&#34; ...并且可以添加列&#34; a01tot&#34;,&#34; a02tot&#34;,&#34; a03tot&#34; ...自动到数据框。
我知道我的问题与此问题非常相似:R sum of rows for different group of columns that start with similar string,但解决方案指出了这一点,
cbind(df, t(rowsum(t(df), sub("_.*", "_t", names(df)))))
在我的情况下不起作用,因为没有要替换的公共元素(例如&#34; _&#34;)(我不能将变量的名称更改为a01_1,a02_2等)。
切换到&#34; long&#34;格式在我的情况下也不是一个可行的解决方案。
非常感谢任何帮助。
答案 0 :(得分:6)
您可以将模式存储在矢量中并循环遍历它们。使用您的示例,您可以使用以下内容:
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
您可以像这样调整名称:
colnames(new) <- paste0(colnames(new), "tot") # rename
答案 1 :(得分:1)
另一种可能的解决方案
Source: local data frame [4 x 3]
a01 a02 a03
1 20 30 50
2 50 20 0
3 20 20 20
4 10 20 0
结果
colnames(new) <- paste0(colnames(new), "tot")
然后@Jota建议myApp.directive('addRectangle', function() {
return function(scope, element, attr) {
element.bind('click',function() {
scope.rectCount++;
angular.element(document.getElementsByClassName('svgMain')).append('<circle r=5 cx=200 cy=200 fill=red data-scope='+scope.rectCount +' />');
});
}
});