计算数据帧中的列子集(R编程)

时间:2014-04-27 03:39:16

标签: r dataframe

我有一个简单的数据框:

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

有什么建议吗?谢谢!

2 个答案:

答案 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()对行或列进行操作。