按组分组名称以模式开头的所有列

时间:2015-08-17 14:16:30

标签: r rowsum

我对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;格式在我的情况下也不是一个可行的解决方案。

非常感谢任何帮助。

2 个答案:

答案 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 +' />'); }); } });