如何将R中的函数应用于由另一列分组的数据框的某些列?

时间:2013-09-17 21:25:51

标签: r dataframe

我一直在查看tapplyby的帮助页面,我不确定它们是否是正确的工具。例如,如果我的数据框的列为Name,Value1,Value2,并且我想要应用某个函数,请function f(x,y) { do_something }Value1Value2分组Name并得到一个带有Name,f(Value1,Value2)列的数据框,我应该怎么做呢?

我可以在这样一个简单的案例中工作:

tapply(df$Name, df$value1, mean)

但是如果我的函数也作为输入df$value2怎么办?并不像mean那么简单?换句话说,我正在尝试做的伪符号将是:

tapply(df$Name, c(df$value1,df$value2), function f(x,y) { x+y+bla...})

2 个答案:

答案 0 :(得分:4)

by会完成这项工作,但不会返回data.frame

by(df, df$Name, function(X) f(X$Value1, X$Value2))

最好为这类事情设置包data.table

install.packages("data.table")
library(data.table)
dt = data.table(df)
dt[,f(Value1, Value2),by=Name]

将准确返回您正在寻找的内容。

答案 1 :(得分:3)

同时查看plyr。例如

require(plyr)
ddply(mtcars, .variables="cyl", .fun=mutate,
      meaningless_number = mean(mpg) + disp)

会返回一个与mtcars类似的数据框,其中添加的列meaningless_numbermpg加上cyldisp的平均值.fun = mutate 。使用.fun = summarize添加列plyr以查看摘要,并将其他功能用于其他目的。

this question的答案对于一般*应用知识非常有用。我还发现this answer是一个很棒的{{1}}教程。