我无法在任何地方找到答案 .
我想计算基于行的平均值的数据帧的新变量 .
例如:
data <- data.frame(id=c(101,102,103), a=c(1,2,3), b=c(2,2,2), c=c(3,3,3))
我想使用mutate来创建变量d,它是a,b和c的意思 . 我希望能够通过选择d = mean(a,b,c)的方式来实现这一点,并且我还需要使用变量范围(例如dplyr)d = mean(a:c) .
而且当然
mutate(data, c=mean(a,b))
要么
mutate(data, c=rowMeans(a,b))
不起作用 .
你能给我一些小费吗?
问候
5 回答
您正在寻找
要么
dplyr非常适合对这类数据进行操作,因为它采用tidy data格式,并且 - 对于有问题的问题 - 您的数据是不整洁的 .
你当然可以先整理它:
看起来像这样:
然后:
当然这会丢弃原始数据 . 您可以使用
mutate
而不是summarize
来避免这种情况 . 最后,您可以再次解开数据:或者,您可以汇总然后将结果与原始表合并:
在任何一种情况下结果都是相同的 . 我在概念上更喜欢第二种变体 .
我认为这是dplyr-ish方式 . 首先,我创建一个函数:
然后,它可以在mutate内部使用:
为了处理
NAs
的可能性,该函数必须被uglified:my_rowmeans2
的缺点是它强制转换为矩阵 . 不过,我不确定这总是比Reduce
方法慢 .还有另外两种方法,如果你有要汇总的列的数字位置或矢量名称,这将非常有用:
要么
代码很少的另一个简单可能性是:
由于rowMeans需要类似矩阵或data.frame的东西,因此可以使用
data.frame(var1, var2, ...)
而不是c(var1, var2, ...)
. 如果您的数据中有NA,则需要告诉R要做什么,例如删除它们:rowMeans(data.frame(a,b), na.rm=TRUE)