我一直在查看tapply
和by
的帮助页面,我不确定它们是否是正确的工具。例如,如果我的数据框的列为Name,Value1,Value2
,并且我想要应用某个函数,请function f(x,y) { do_something }
对Value1
和Value2
分组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...})
答案 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_number
是mpg
加上cyl
个disp
的平均值.fun = mutate
。使用.fun = summarize
添加列plyr
以查看摘要,并将其他功能用于其他目的。
this question的答案对于一般*应用知识非常有用。我还发现this answer是一个很棒的{{1}}教程。