2015-01-07 101 views
1

我想將Rlapply函數返回的信息修剪爲第一個元素。處理來自R的lapply函數的輸出/從列表中刪除元素

所以,對於這樣的事情

is(rnorm(10,10)) 
[1] "numeric"  "vector"  "atomicVector" "index"  "number"  ... 

我想在剛剛結束只保留第1個要素"numeric"

完整的例子

x <- rnorm(10,10) 
y <- sample(c("a","b","c"),10, replace = TRUE) 
z <- factor(sample(c("a","b","c"),10, replace = TRUE)) 
dat.fake <- data.frame(x,y,z, stringsAsFactors = FALSE) 

使用lapply得到數據幀中每列的信息

lapply(dat.fake,is) 

我想只得到

$x 
[1] "numeric"  
$y 
[1] "character"   
$z 
[1] "factor" 

而不是

$x 
[1] "numeric"  "vector"  "atomicVector" ... 
$y 
[1] "character"   "vector"    "data.frameRowLabels" ... 
[6] "index"    
$z 
[1] "factor" "integer" "oldClass" "numeric" "vector" 

全力輸出的是有沒有辦法中lapply做到這一點或類似的功能,或者什麼是最有效的處理由lapply返回的列表中的信息的方式?

+1

在你可以使用'這個特定的情況下, lapply(dat.fake,class)'返回你感興趣的內容。 –

回答

2

在這種情況下,一個匿名函數似乎最有意義:

> lapply(dat.fake,function(x) is(x)[1]) 
$x 
[1] "numeric" 

$y 
[1] "character" 

$z 
[1] "factor" 

要回答的標題提出的問題,使用基本提取:

> temp <- lapply(dat.fake, is) 
> lapply(temp, "[", 1) 
$x 
[1] "numeric" 

$y 
[1] "character" 

$z 
[1] "factor" 
+0

感謝您的及時響應!學習如何使用列表的資源的任何一般建議? (書籍,教程等)。我有Matloff的R編程藝術,它只有基礎知識。我需要學習有效地編輯,合併,刪除列表的元素。 –

0

另外,效率低下的方法是定義一個新的函數,該函數僅提取矢量的第一個元素(這是此列表中的每個元素)並再次使用lapply

與newfunction

lapply(lapply.out,first.element) #**EDITED** 

和輸出

first.element <- function(x) 
{ 
    x[1] 
} 


lapply.out <- lapply(dat.fake,is) 

使用lapply抓起只是一個載體的第1個要素的新功能是

$x 
[1] "numeric" 
$y 
[1] "character" 
$z 
[1] "factor" 
+0

我想你想在第二次lapply調用中將'dat.fake'改成'lapply.out'。還要注意,你可以用阿南達的答案第二部分的代碼,或者你可以使用'head',例如:'lapply(lapply.out,head,1)',這也可以做到這一點。 –

+0

是的,原文中的「lapply(dat.fake,first.element)」應該是「lapply(lapply.out,first.element)」我已經將這個關鍵字編碼 –