我有一个简单的数据框:
a=data.frame(first=c(1,2,3),second=c(3,4,5),third=c('x','y','z'))
我尝试返回包含第一列和第二列的列均值的数据框。我一直在这样做:
apply(a[,c('first','second')],2,mean)
返回适当的输出:
first second
2 4
但是,我想知道我是否可以使用函数by
来完成它。我试过这个:
by(a, c("first", "second"), mean)
导致:
Error in tapply(seq_len(3L), list(`c("first", "second")` = c("first", :
arguments must have same length
然后,我尝试了这个:
by(a, c(T, T,F), mean)
这也没有得出正确答案:
c(T,T,F): FALSE
[1] NA
有什么建议吗?谢谢!
答案 0 :(得分:1)
您可以对原始数据的子集使用colMeans
(列均值)
> a <- data.frame(first = c(1,2,3), second = c(3,4,5), third = c('x','y','z'))
如果您知道列号,而不知道列名,
> colMeans(a[, 1:2])
## first second
## 2 4
或者,如果您不知道列号但知道列名称,
> colMeans(a[, c("first", "second")])
## first second
## 2 4
最后,如果你对列完全一无所知,只想要数字列的方法,
> colMeans(a[, sapply(a, is.numeric)])
## first second
## 2 4
答案 1 :(得分:0)
by()不是正确的工具,因为它是tapply()的包装器,它将数据帧划分为符合某些条件的子集。如果您有另一列,比如说第四列,则可以使用by()为该列拆分数据框,然后使用apply()对行或列进行操作。