Элементы внутри списков.

Я относительно новичок в R (~ 3 месяца), и поэтому я просто использую все типы данных. В то время как списки - это очень полезный способ хранения разнородных данных в одном месте, они также чрезвычайно негибкие для вызовов функций, и загадывают меня с тоской.

Для работы, которую я делаю, я часто использую списки, потому что мне нужно держать кучу векторов разной длины. Например, я отслеживаю статистику производительности около 10 000 различных транспортных средств, и есть определенные транспортные средства, которые настолько похожи, что они могут по существу рассматриваться как одни и те же транспортные средства для определенных анализов.

Итак, скажем, у нас есть этот список идентификаторов автомобиля:

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

Для простоты.

Я хочу сделать две вещи:

  • Скажите, какой элемент списка имеет конкретный автомобиль. Поэтому, когда я говорю R, я работаю с транспортным средством 2, он должен сказать мне b или [2]. Я чувствую, что это должно быть что-то простое, как вы можете сделать

    match(3,b)
    > 2
  • Преобразуйте его в фрейм данных или что-то подобное, чтобы его можно было сохранить как CSV. Неиспользуемые строки могут быть пустыми или NA. Что я должен был сделать до сих пор:

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

Что кажется глупым.

2 ответа

Для вашего первого вопроса:

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


Обе эти задачи (и многие другие) стали бы намного проще, если бы вы "сгладили" свои данные в 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")

licensed under cc by-sa 3.0 with attribution.