【问题标题】:R data.frame: rowSums of selected columns by grouping vectorR data.frame:通过分组向量选择列的rowSums
【发布时间】:2026-01-15 02:10:01
【问题描述】:

我有一个包含一系列数字列的数据框,两边都被(不相关的)字符列包围。我想获得一个新的数据框,它保留不相关列的位置,并通过某个分组向量将数字列彼此相加(或按组对数据框应用一些其他逐行函数)。示例:

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,1,2,2),即我想添加前两列和后两列。对于四列,它可以是长度为 4 的任何因子,最多 4 个级别,例如(1,1,1,2) 或 (1,2,3,3)。
  • 请在你的 OP 中包含,你说的是选择列而不是分组,你在这里选择的词很混乱
  • 您可以执行类似GrpIndx <- gl(2,2,4); Numcols <- 2:5 ; cbind(sample[-Numcols], t(rowsum(t(sample[Numcols]), paste0("X", GrpIndx)))) 之类的操作,但我仍然不确定您如何确定哪一列是数字。
  • 我使用的示例分组向量可以在 OP @grrgrrbla 中清楚地找到。不知道你的抱怨是什么。我需要选择相邻的数字列,然后根据分组向量添加它们。

标签: r dataframe plyr apply r-factor


【解决方案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

【讨论】:

    最近更新 更多