如何在列表中对数据框进行子集操作并返回数据框?

7

当在列表内对数据框进行子集操作时,我得到的是向量而不是数据框(详见下面的示例)。如何避免这种情况并获得数据框?

l <- list(data.frame(a=c(1,2,3)), data.frame(b=c(4,5,6,5)), data.frame(c=c(3,4,5,6)))
names(l) <- c("A", "B", "C")
l
lapply(l, function(x) x[2:nrow(x), ])

输出

> l <- list(data.frame(a=c(1,2,3)), data.frame(b=c(4,5,6,5)), data.frame(c=c(3,4,5,6)))
> names(l) <- c("A", "B", "C")
> l
$A
  a
1 1
2 2
3 3

$B
  b
1 4
2 5
3 6
4 5

$C
  c
1 3
2 4
3 5
4 6

> lapply(l, function(x) x[2:nrow(x), ])
$A
[1] 2 3

$B
[1] 5 6 5

$C
[1] 4 5 6

lapply 返回的是一个列表,而不是你所声称的向量 - Dirk Eddelbuettel
是的,我知道,我的意思是列表中的向量。 - jrara
@Dirk:严格来说,列表本身就是一个向量!;-) - Tommy
2
@Tommy:在R语言中是这样吗?我认为列表和向量一样都是基本数据类型... - Ari B. Friedman
1
is.vector(list()) # TRUE ...但通常我们在说向量时指的是原子向量。 is.atomic(list()) # FALSE - Tommy
1个回答

12
你需要使用`drop=FALSE`参数。
> res <- lapply(l, function(x) x[2:nrow(x),, drop=FALSE])
> sapply(res,class)
           A            B            C 
"data.frame" "data.frame" "data.frame" 
> res
$A
  a
2 2
3 3

$B
  b
2 5
3 6
4 5

$C
  c
2 4
3 5
4 6

2
是的,与lapply无关。 - hadley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接