attach(airquality)
s <- split(airquality, airquality$Month)如果我运行
lapply(s, colMeans(s[,c("Ozone","Solar.R","Wind")])) 出现错误。它显示了错误的维度数量。
lapply(airquality, function(x)colMeans(x)) 还显示了相同的错误。
lapply(s, function(x)colMeans(s[,"Ozone","Solar.R","Wind"])这段代码运行得非常好。
但是:
f<-function(x){
colMeans(x[,c("Ozone","Solar.R","Wind")])}
f(s) #error incorrect dimensions
class(s) # class of s is list
f(airquality) #gives mean of each columnfunction()是否在创建维度?如果是这样,为什么airquality上的lapply不能工作?
发布于 2016-01-08 14:06:44
您的split函数返回一个列表,但您像处理数组或数据框一样处理它。
错误来自s[,c("Ozone","Solar.R","Wind")],它不能以这种方式子集,因为它是一个列表。试一试
s$`9`[,c("Ozone","Solar.R","Wind")]您将看到这是有效的,如下所示
s$`9`是一个数据帧。
在您的第一次尝试中,您提供的不是一个函数,而是一个在s上求值的函数。由于您不能像上面那样操作s,因此在s上调用函数也会导致相同的错误,因为函数的输入一开始就有问题。
第二次尝试失败了,因为lapply最终会将每一列逐个提供给colMeans函数,该函数需要二维数组(而您已经为其提供了一维数组)。
最后一个调用起作用的原因是函数
function(x)colMeans(x[,c("Ozone","Solar.R","Wind")])可以在列表s的每一项上调用,因为每一项都是dataframe。lapply函数只是将其应用于列表中每一项。
lapply(s,function(x)colMeans(x[,c("Ozone","Solar.R","Wind")]))才是解决这个问题的正确方法。
另一种方法是使用by函数
by(airquality[,c("Ozone","Solar.R","Wind")],airquality$Month,colMeans)https://stackoverflow.com/questions/34670364
复制相似问题