4

我在 R 方面相对较新(约 3 个月),所以我只是掌握了所有不同数据类型的窍门。虽然列表是在一个地方保存不同数据的一种超级有用的方式,但它们对于函数调用也非常不灵活,让我感到焦虑。

对于我正在做的工作,我经常使用列表,因为我需要保存一堆不同长度的向量。例如,我正在跟踪大约 10,000 辆不同车辆的性能统计数据,并且有些车辆非常相似,在某些分析中它们基本上可以被视为相同的车辆。

假设我们有这个车辆 ID 列表:

List <- list(a=1, b=c(2,3,4), c=5)

为了简单起见。

我想做两件事:

  1. 告诉我特定车辆在列表的哪个元素中。所以当我告诉 R 我正在使用车辆2时,它应该告诉我b[2]。我觉得这应该是一些简单的事情,比如你可以怎么做

    match(3,b)
    > 2
    
  2. 将其转换为数据框或类似的东西,以便可以将其保存为 CSV。未使用的行可以是空白或NA. 到目前为止我必须做的是:

    for(i in length(List)) {
    length(List[[i]]) <- max(as.numeric(as.matrix(summary(List)[,1])))
    }
    DF <- as.data.frame(List)
    

这似乎很愚蠢。

4

2 回答 2

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")
于 2012-10-23T22:57:03.590 回答
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
于 2012-10-23T23:21:59.647 回答