如何访问R中列表元素的组件

时间:2014-09-22 15:55:40

标签: arrays r list

我有一份衣衫褴褛的清单,我想与之合作。即我想使用apply函数快速简单地从列表中提取元素。以下代码尝试近似我的情况:

vec1 <- c("B","D","E","NA")
vec2 <- c("B","D","E","NA")
vec3 <- c("B","C","E","NA")


write.table(vec1, file="./vec1.csv", sep=",", quote=F)
write.table(vec2, file="./vec2.csv", sep=",", quote=F)
write.table(vec3, file="./vec3.csv", sep=",", quote=F)

vectors.files <- list.files(path=getwd(),recursive=F, pattern=paste("*.csv",sep=""))

vectors.list <- lapply(vectors.files, read.csv)

那么我如何才能创建一个新对象,例如vectors.list中每个列表元素的第二行?

谢谢,

马特

2 个答案:

答案 0 :(得分:0)

如果将矢量存储在数据框中,则可以进行子集化。

> df <- data.frame(vectors.list)
> row2 <- df[2,]
> row2
  x x.1 x.2
2 D   D   C

答案 1 :(得分:0)

作为最终输出格式,您并不是很清楚,但您可能想尝试以下模板的变体:

lapply(vectors.list, function(x) x[2, , drop = FALSE])
# [[1]]
#   x
# 2 D
# 
# [[2]]
#   x
# 2 D
# 
# [[3]]
#   x
# 2 C

在这里,我们刚刚将一个匿名函数(function(x))传递给了&#34; vectors.list&#34;中的项目。在这种情况下,我们使用[使用基本子集来提取第二行。 drop = FALSE是保留data.frame结构,因为结果是单列data.frame(通常简化为vector)。

请注意,生成的data.frame中的list仍然包含&#34; x&#34;的所有原始levelsfactor。如果您只想保留该行中的特定因子,请使用droplevels

比较

str(lapply(vectors.list, function(x) x[2, , drop = FALSE]))
# List of 3
#  $ :'data.frame':  1 obs. of  1 variable:
#   ..$ x: Factor w/ 3 levels "B","D","E": 2
#  $ :'data.frame': 1 obs. of  1 variable:
#   ..$ x: Factor w/ 3 levels "B","D","E": 2
#  $ :'data.frame': 1 obs. of  1 variable:
#   ..$ x: Factor w/ 3 levels "B","C","E": 2
str(lapply(vectors.list, function(x) droplevels(x[2, , drop = FALSE])))
# List of 3
#  $ :'data.frame':  1 obs. of  1 variable:
#   ..$ x: Factor w/ 1 level "D": 1
#  $ :'data.frame': 1 obs. of  1 variable:
#   ..$ x: Factor w/ 1 level "D": 1
#  $ :'data.frame': 1 obs. of  1 variable:
#   ..$ x: Factor w/ 1 level "C": 1

您可能还想探索as.character(unlist(x[2, ])