给定一个简单的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);
}
答案 0 :(得分:5)
max
和min
接受多个向量作为参数,
并计算所有这些中的最大值/最小值。
mean
更受限制,它只需要支持类型的单个参数。
例如,vector是受支持的类型。
有关详细信息,请参阅?max
和?mean
,尤其是使用,参数和详细信息部分。
dat
的类型为data.frame
。
dat[1,]
的类型也是如此,
因为数据帧的一行也是数据帧,
在每个列中都有一个值。
将数据框传递给max
时,
它在数据框的列(向量)上运行,
返回所有这些值的最大值。
将数据框传递给mean
时,
它会给您一个错误,因为数据框不是受支持的类型之一。
您可以使用unlist
从数据框中获取矢量。
它实际上是通过连接数据帧的所有向量来实现的。
例如,unlist(dat)
将返回向量1 2 3 4
。
dat[1,]
是dat
的第一行,
其中包含向量1
和3
,
因此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.numeric
和Filter
的结合比简单地列出列要慢很多。
修改的
抱歉,我希望我可以将其作为对前一个答案的评论,因为我认为这是有用的澄清,但没有其他方式发布。为了给它提供更多关于开销的信息,我对抓取数字列的方法进行了微观基准测试:
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
只要您按名称和号码知道列,就会更快,但除非过滤器或蓝宝石有帮助。