2016-09-22 90 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