【问题标题】:R: how to subset a data.frame in a list and return data.frame?R:如何对列表中的 data.frame 进行子集化并返回 data.frame?
【发布时间】:2011-10-19 23:55:31
【问题描述】:

在列表中设置 data.frame 的子集时,我得到的是向量而不是 data.frames(参见下面的示例)。如何避免这种情况并获得 data.frames?

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 返回一个 list 而不是您声称的 vector
  • 是的,我知道,我的意思是列表中的向量。
  • @Dirk:从技术上讲,列表向量! ;-)
  • @Tommy:在 R 中是这样吗?我认为列表是一种基本数据类型,就像向量一样......
  • is.vector(list()) # TRUE ...但当我们说矢量时,通常我们指的是一个原子矢量。 is.atomic(list()) # FALSE

标签: r dataframe subset


【解决方案1】:

您需要 ,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

【讨论】:

  • 是的,与lapply无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多