Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r聚合数据帧:某些列未更改,某些列聚合_R_Aggregate - Fatal编程技术网

r聚合数据帧:某些列未更改,某些列聚合

r聚合数据帧:某些列未更改,某些列聚合,r,aggregate,R,Aggregate,我曾尝试查看聚合、应用等手册,但我找不到一些示例,其中某些列被应用的函数跳过,而其他列按原样复制。例如: > olddf = data.frame(code=c("one","one","two"), val1=c(1,2,3), val2=c(4,5,6), val3=c(7,8,9)) > olddf code val1 val2 val3 1 one 1 4 7 2 one 2 5 8 3 two 3 6 9 &g

我曾尝试查看聚合、应用等手册,但我找不到一些示例,其中某些列被应用的函数跳过,而其他列按原样复制。例如:

> olddf = data.frame(code=c("one","one","two"), val1=c(1,2,3), val2=c(4,5,6), val3=c(7,8,9))
> olddf
  code val1 val2 val3
1  one    1    4    7
2  one    2    5    8
3  two    3    6    9
> 
如何聚合olddf以获得新的数据帧,其中:

  • 代码列保持原样
  • val1已跳过
  • val2通常是聚合的,例如总和()
  • 一个新列是基于一个早期聚合创建的。。。e、 g.新列=总和(val3)/总和(val2)
我基本上想要:

> newdf
  code val2 newcol
1  one    9 1.6666
2  two    6 1.5000

我希望一步到位,而不是定义一个单独的函数来处理每个列/聚合。这可能吗?

您可以分两步完成,关键是使用聚合函数。在by()参数中,您需要指定要聚合的方式。在这种情况下,根据“代码”中的值进行聚合。然后,通过指定感兴趣的函数添加第三列

aggregate <- aggregate(olddf[, c("val2", "val3")], by = list(olddf$code), FUN = sum)
aggregate$newcol <- aggregate$val3/aggregate$val2

aggregateTry
data.table

library(data.table)
setDT(olddf)[, .(val2 = sum(val2),
                 newcol = sum(val3)/sum(val2)), by = code]
#    code val2   newcol
# 1:  one    9 1.666667
# 2:  two    6 1.500000

嗨,非常感谢。这似乎是可行的,但保留了不需要的列。当我尝试使用我发布的示例数据时,它是有效的。但是,泛化到我的实际数据集会产生错误:as.vector(x,“list”)中的错误:无法将类型“closure”强制为类型“list”的向量:-(我将接受答案,尽管它确实给出了示例结果。更新:我有一个输入错误-它正常工作了。太好了!!谢谢