【问题标题】:How can you aggregate a single column based all the other columns?如何基于所有其他列聚合单个列?
【发布时间】:2017-07-04 01:07:10
【问题描述】:

我有大量包含调查数据的 CSV 文件。结果,我知道有大量重复数据。因此,我想通过查找独特响应的频率来总结数据。通常,我通过插入一个值为 1 的频率列然后对其求和来做到这一点。像这样:

data = aggregate(data$Freq, by = list(ONE = data$ONE, TWO = data$TWO, THREE  = data$THREE), FUN = sum)

在这种情况下,这种方法是不可行的,因为列名不一致并且数量可变。示例数据如下所示:

data = data.frame(
   ONE   = sample(1:2, 40, TRUE), 
   TWO   = sample(1:2, 40, TRUE),
   THREE = sample(1:5, 40, TRUE)); 
data$Freq = 1

如何保留唯一值并找到它们的出现次数?

【问题讨论】:

  • 是否有机会获得一些样本数据集来拯救我们自己的数据集?
  • data = data.frame(ONE=sample(LETTERS[1:4],20,TRUE), TWO=sample(LETTERS[1:4],20,TRUE)); data$Freq=1 ?
  • @Spacedman 因素。我已根据有效的调查回复将它们清理为 [0, 1] 或 [1, 5]。
  • 您可以像这样使用aggregate 的公式界面:aggregate(Freq ~ ., data=data, sum)。点表示“所有其他变量”。
  • 作为第二种选择,使用您问题中的直接界面,​​您可以使用grep,如aggregate(data$Freq, by = data[-grep("Freq", names(data))], FUN = sum)

标签: r aggregate


【解决方案1】:

如果您想在不创建 Freq=1 变量的情况下执行此操作,则可以“即时”创建该变量:

> head(data)
  ONE TWO THREE
1   D   D     C
2   A   B     C
3   C   B     D
4   A   A     D
5   A   B     A

> aggregate(rep(1,nrow(data)) ~ ., data=data, sum)

   ONE TWO THREE rep(1, nrow(data))
1    B   A     A                  1
2    C   A     A                  3
3    D   A     A                  2
4    A   B     A                  1
5    D   B     A                  1

但它确实为该列提供了一个粗略的名称。包裹在setNames:

> setNames(aggregate(rep(1,nrow(data)) ~ ., data=data, sum), c(names(data),"Freq"))
   ONE TWO THREE Freq
1    B   A     A    1
2    C   A     A    3
3    D   A     A    2
4    A   B     A    1
5    D   B     A    1

【讨论】:

  • 或者你可以使用cbind添加这样的名字aggregate(cbind(Freq=rep(1,nrow(data))) ~ ., data=data, sum)
猜你喜欢
  • 1970-01-01
  • 2018-09-28
  • 2013-08-09
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多