2015-01-07 102 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)”我已经将这个关键字编码 –