Вземете максималната дължина на няколко списъка

Имам няколко списъка с подобни имена, като "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*, a, , стойност = c(82.4416264694195, 505.003082621159, : замяната има 5 елемента, трябват 33

Знам, че това е така, защото моите списъци имат различна дължина, така че, за да заобиколя този проблем, реших да променя дължината на ВСИЧКИ мои списъци наведнъж (защото те са повече от 200 списъка).

Но не можах да намеря решение, за да вкарам максималната дължина на тези списъци в цикъла.

Намерих решение за списъци с неравни дължини тук:
добавяне на NA, за да направят всички елементи на списъка с еднаква дължина

Така че се опитах да го адаптирам към моя случай, така:

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

Ако стартирам length(dist124) = length(dist198), например, мога да ги направя равни, но търсих решение за цикъл, тъй като имам много списъци, за да актуализирам дължините му.


person Rebeca Ferreira    schedule 12.02.2017    source източник
comment
защо искате да интегрирате различните списъци в един data.frame?   -  person R Yoda    schedule 13.02.2017
comment
Защото тогава трябва да направя някои изчисления и да ги експортирам в уникален файл. Решението на lmo работи добре за мен. Благодаря :)   -  person Rebeca Ferreira    schedule 13.02.2017


Отговори (2)


За да получите максималната дължина на голям брой списъци с подобни имена, можете да направите следното:

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

Тук аргументът на шаблона е регулярен израз, който съответства на всеки обект с името "dist", последвано от цифрови цифри. mget поставя съответстващите обекти в списък. Следващия,

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

Функцията lengths, въведена в R 3.2.0, изчислява дължината на всеки обект в списък и е по-бърза реализация на sapply(myList, length).

person lmo    schedule 12.02.2017
comment
Страничен въпрос, има ли начин да append изброява начина, по който вие mget (имам предвид с pattern? - person d.b; 13.02.2017
comment
lmo, това е, което търсих, вече е внедрено! Благодаря ти много :D - person Rebeca Ferreira; 13.02.2017
comment
@d.b Не съм напълно сигурен какво търсите, ето един опит: l1 <- list(a=1, b=5); l2 <- list(e=6, d=5) Това дава вложен списък, след което го изравнявате с unlist като unlist(mget(ls(pattern="l\\d+")), recursive=FALSE). Освен това можете да добавяте списъци заедно с c. - person lmo; 13.02.2017

След внедряването на кода, предоставен от @Imo (благодаря!), успях да конвертирам списъка си със списъци в рамка с данни, така че пълният код беше така:

# 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)))

Благодаря на всички за помощта ;)

person Rebeca Ferreira    schedule 13.02.2017