2016-09-22 46 views
0

我有以下代码:R:应用功能,数据帧

library(Ecdat) 
data(Fair) 
Fair[1:5,] 

x1 = function(x){ 
    mu = mean(x) 
    l1 = list(s1=table(x),std=sd(x)) 
    return(list(l1,mu)) 
} 

mylist <- as.list(Fair$occupation, 
       Fair$education) 

x1(mylist) 

我想那是什么X1输出为MYLIST选择的项目的结果。但是,我得到In mean.default(x) : argument is not numeric or logical: returning NA

+2

请检查'mylist'的'str'。如果它是一个'list',则遍历列表元素并应用函数即。 'lapply(mylist,x1)'另外,我认为'as.list'没有达到你想要的效果,因为它分成了一个长度为601的'list',每个元素有1个元素。也许你只需要'lapply(Fair [c(“职业”,“教育”)],x1)' – akrun

回答

0

您需要lapply使用,如果你的传递列表功能

output<-lapply(mylist,FUN=x1) 

这将处理在MYLIST每个元素的功能x1和返回结果的列表输出。

0

这里mylist的创建方式不正确,并且list也不需要,因为data.framelist,其列为等长。所以,仅仅子集的感兴趣的列和应用功能

lapply(Fair[c("occupation", "education")], x1) 

在OP的代码,as.list简单地只在每一个元素创建的listlength 601。

str(mylist) 
#List of 601 
#$ : int 7 
#$ : int 6 
#$ : int 1 
#... 
#... 

代码中的另一个问题是它甚至没有考虑第二个参数。使用一个简单的例子

as.list(1:3, 1:2) 
#[[1]] 
#[1] 1 

#[[2]] 
#[1] 2 

#[[3]] 
#[1] 3 

第二个参数根本没有考虑。它可能是

list(1:3, 1:2) 
#[[1]] 
#[1] 1 2 3 

#[[2]] 
#[1] 1 2 

但对于data.frame列,我们并不需要显式调用list因为它是vectors具有相等长度的list

关于OP的帖子中的错误,mean适用于vector s,而不适用于listdata.frame