R data.frame:通过对向量

时间:2015-06-11 10:03:19

标签: r dataframe plyr apply r-factor

我有一个带有一系列数字列的数据框,两边都是(不相关的)字符列。我想获得一个新的数据框,保持不相关列的位置,并通过某个分组向量将数字列添加到彼此(或按组应用其他一些行方式函数到数据框)。例如:

sample = data.frame(cha1 = c("A","B"),num1=1:2,num2=3:4,num3=11:12,num4=13:14,cha2=c("C","D"))
> sample
  cha1 num1 num2 num3 num4 cha2
1    A    1    3   11   13    C
2    B    2    4   12   14    D

目标是获得

> goal
  cha1 X1 X2 cha2 
1    A  4 24    C
2    B  6 26    D

即。我根据分组向量gl(2,2,4) = (1,1,2,2) [levels: 1,2]

对4个数字列求和

对于纯数字数据框,我发现了以下方法:

sample_num = sample[,2:5] #select numeric columns
data.frame(t(apply(sample_num,1,function(row) tapply(row, INDEX=gl(2,2,4),sum))))

我可以将它与重新插入字符列结合起来以给出预期的结果,但我真的在寻找一种更优雅的方式。我对plyr方法特别感兴趣,因为我正在尝试迁移到plyr进行所有数据帧操作。我想第一步是将数据框转换为长格式,但我不知道如何从那里开始。

一个'绝对'要求是我不能没有gl(n,k,l)分组方法,因为我需要它适用于广泛的数据帧和分组因子。

编辑:为简单起见假设我知道哪些列是相关的数字列。我不关心如何选择它们,我关心如何在不弄乱原始数据帧结构的情况下进行分组求和。

谢谢!

1 个答案:

答案 0 :(得分:-1)

Grpindex<-gl(2,2,4)    
goal<-cbind.data.frame(sample["cha1"],(t(rowsum(t(sample[,2:5]), paste0("X",Grpindex)))),sample["cha2"])

输出:

  cha1 X1 X2 cha2
1    A  4 24    C
2    B  6 26    D