2017-02-12 25 views
0

У меня есть несколько списков с похожими именами, такими как «dist124», «dist131» и т. Д. У меня возникла проблема при привязке этих списков/массивов в одном фрейме данных. Мой код выглядит так:Получить максимальную длину нескольких списков

id <- c(124,131,137,198) 
# create the dataframe with nrow as an initial size only for test 
# and ncols as the max length of my lists 
df <- data.frame(matrix(NA, nrow = 4, ncol = 33)) 

row.names(df) <- id 
a = 1 
for(i in id){ 
    df[a,] <- do.call(rbind, lapply(paste("dist",i, sep=""), get)) 
    a <- a+1} 

Тогда я получаю сообщение об ошибке:

Ошибка в [<-.data.frame (*tmp*, а, ценностные = с (+82,4416264694195, +505,003082621159,: замена имеет 5 пунктов, потребность 33

Я знаю, что это потому, что мои списки имеют разную длину, поэтому, чтобы обойти эту проблему, я решил изменить длину ВСЕХ моих списков сразу (потому что их более 200 списков).

Но я не мог найти решение, чтобы получить максимальную длину этих списков в цикле.

Я нашел решение для списков разной длины здесь:
adding NA to make all list elements equal length

Так я пытался адаптировать его к моему делу, как это:

b <- 1 
for(i in id){ 
    assign() 
    n[b] <- length(paste("dist",i, sep="")) 
lapply(paste("dist",i, sep=""), `length<-`, n) 
b <- b+1} 

Если я бегу длину (dist124) = length (dist198), например, я могу сделать их равными, но я искал решение цикла, так как у меня есть много списков для обновления его длин.

+0

Почему вы хотите интегрировать разные списки в один 'data.frame'? –

+0

Потому что тогда мне нужно сделать некоторые вычисления, а также экспортировать их в уникальный файл. Решение lmo хорошо работало для меня. Спасибо :) –

ответ

3

Чтобы получить максимальную длину большого количества списков с похожими названиями, вы могли бы на следующее:

# put the lists into a list 
myLists <- mget(ls(pattern="dist\\d+")) 

Здесь шаблон аргументом является регулярным выражением, которое соответствует любому объекту с именем «дистом », а затем числовые цифры. mget помещает сопоставленные объекты в список. Далее,

# get the maximum length from these lists 
maxLength <- max(lengths(myLists)) 

lengths функция, введенная в R 3.2.0, вычисляет длину каждого объекта в списке и является более быстрой реализацией sapply(myList, length). (Спасибо!)

+0

Боковой вопрос, есть ли способ «добавить» списки так, как вы 'mget' (я имею в виду« pattern »? –

+0

lmo, это то, что я искал, уже реализовано! Большое спасибо: D –

+1

@db Я не совсем уверен, что вы ищете, вот одна попытка: 'l1 <- list (a = 1, b = 5); l2 <- list (e = 6, d = 5)' Это дает вложенный список, затем сглаживает его с 'unlist' как' unlist (mget (ls (pattern = "l \\ d +")), recursive = FALSE) '. Также вы можете добавлять списки вместе с' c'. – lmo

0

После внедрения кода, предоставленного @Imo, я был в состоянии преобразовать свой список списков в dataframe, так что полный код был так:

# Join all lists in one nested list # 
myLists <- mget(ls(pattern="dist\\d+")) 
# Get the max length of those lists # 
maxLength <- max(lengths(myLists)) 
# generating a dataframe from the nested list, making all lengths equal 
allDistancesDf <- as.data.frame(do.call(rbind, lapply(myLists, `length<-`, maxLength))) 

Спасибо всем за help;)