我可以计算行或列的最小值或最大值,我可以计算列的平均值,但我无法计算行的平均值。为什么不?

时间:2017-11-07 20:26:51

标签: r dataframe

给定一个简单的2x2数据框,我可以计算行或列的最小值或最大值,我可以计算列的平均值,但我不能计算一行的平均值。为什么不呢?

.has-error .form-control > .selectpicker {
    border-color: #a94442;
    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
    box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
}

3 个答案:

答案 0 :(得分:5)

maxmin接受多个向量作为参数, 并计算所有这些中的最大值/最小值。

mean更受限制,它只需要支持类型的单个参数。 例如,vector是受支持的类型。

有关详细信息,请参阅?max?mean,尤其是使用参数详细信息部分。

dat的类型为data.framedat[1,]的类型也是如此, 因为数据帧的一行也是数据帧, 在每个列中都有一个值。

将数据框传递给max时, 它在数据框的列(向量)上运行, 返回所有这些值的最大值。

将数据框传递给mean时, 它会给您一个错误,因为数据框不是受支持的类型之一。

您可以使用unlist从数据框中获取矢量。 它实际上是通过连接数据帧的所有向量来实现的。 例如,unlist(dat)将返回向量1 2 3 4dat[1,]dat的第一行, 其中包含向量13, 因此unlist(dat[1,])将返回向量1 2。 你可以打电话给mean

答案 1 :(得分:3)

如果您的所有列都是数字,则可以使用rowMeans(dat)。要紧凑地选择数字,您可以(例如)rowMeans(iris[, 1:4])

如果您不想担心识别哪些列是数字,您还可以使用sapply()生成用于子集化的逻辑列索引:

rowMeans(iris[, sapply(iris, is.numeric)])

另请注意,rowMeans()有一个na.rm参数,如果您认为您的数据可能缺少值,则可以将其设置为TRUE

答案 2 :(得分:1)

添加到lefft的amswer,您不需要知道数字列,并可以使用Filter来查找它们。

rowMeans(Filter(is.numeric,dat),na.rm=T)

会做到这一点。话虽如此,如果你知道列,is.numericFilter的结合比简单地列出列要慢很多。

修改

抱歉,我希望我可以将其作为对前一个答案的评论,因为我认为这是有用的澄清,但没有其他方式发布。为了给它提供更多关于开销的信息,我对抓取数字列的方法进行了微观基准测试:

library(microbenchmark)
df.mb<-data.frame(
  c(runif(10000)),c(runif(10000)),c(runif(10000)),
  c(rep("A",10000)),c(rep("A",10000)),c(rep("A",10000)),
  c(rep("A",10000)),c(rep("A",10000)),c(rep("A",10000)))
names(df.mb)<-c("a","b","c","d","e","f","g","h","i")


function1<-function(x) {rowMeans(Filter(is.numeric,x))}
function2<-function(x) {rowMeans(x[,1:3])}
function3<-function(x) {rowMeans(x[,c("a","b","c")])}
function4<-function(x) {rowMeans(x[ ,sapply(x,is.numeric)])}

microbenchmark(
  function1(df.mb),
  function2(df.mb),
  function3(df.mb),
  function4(df.mb)
)

Unit: microseconds
         expr     min       lq     mean   median       uq       max neval cld
 function1(df.mb) 351.148 372.4810 768.2310 464.0005 492.5875 16216.321   100   a
 function2(df.mb) 317.441 338.5605 667.6871 429.6545 442.0270 15281.921   100   a
 function3(df.mb) 317.867 340.4810 581.0908 421.1205 439.0410  8965.121   100   a
 function4(df.mb) 363.521 385.2810 735.4673 461.6535 519.2545 15701.334   100   a

只要您按名称和号码知道列,就会更快,但除非过滤器或蓝宝石有帮助。