我在R(约3个月)中比较新,所以我只是掌握了所有不同的数据类型。虽然列表是一种非常有用的方法,可以在一个地方保存不同的数据,但它们对于函数调用也非常不灵活,并且让我感到焦虑。
对于我正在做的工作,我经常使用列表,因为我需要持有一堆不同长度的向量。例如,我正在跟踪大约10,000辆不同车辆的性能统计数据,并且某些车辆非常相似,它们基本上可以被视为用于某些分析的相同车辆。
因此,假设我们有车辆ID列表:
List <- list(a=1, b=c(2,3,4), c=5)
为了简单起见。
我想做两件事:
告诉我特定车辆所在列表的哪个元素。所以当我告诉R我正在使用车辆2
时,它应该告诉我b
或{{1} }。我觉得它应该像你能做的那样简单
[2]
将其转换为数据框或类似内容,以便将其保存为CSV格式。未使用的行可以为空或match(3,b)
> 2
。到目前为止,我必须做的是:
NA
这似乎很愚蠢。
答案 0 :(得分:4)
如果您要将数据“扁平化”为data.frame,那么这两项任务(以及许多其他任务)将变得更加容易。这是一种方法:
fun <- function(X)
data.frame(element = X, vehicle = List[[X]], stringsAsFactors = FALSE)
df <- do.call(rbind, lapply(names(List), fun))
# element vehicle
# 1 a 1
# 2 b 2
# 3 b 3
# 4 b 4
# 5 c 5
掌握了data.frame,以下是执行两项任务的方法:
## Task #1
with(df, element[match(3, vehicle)])
# [1] "b"
## Task #2
write.csv(df, file = "outfile.csv")
答案 1 :(得分:4)
关于你的第一个问题:
which(sapply(List, `%in%`, x = 3))
# b
# 2
对于第二个问题,你可以使用像这样的函数:
list.to.df <- function(arg.list) {
max.len <- max(sapply(arg.list, length))
arg.list <- lapply(arg.list, `length<-`, max.len)
as.data.frame(arg.list)
}
list.to.df(List)
# a b c
# 1 1 2 5
# 2 NA 3 NA
# 3 NA 4 NA