Найти длину списка списков в R

#r #list

#r #Список

Вопрос:

У меня есть список списков, и я хочу найти длину каждого списка. Вызывается список списков GroupedLists , каждый из которых содержит 2 столбца.

 [[1]]
          preds     ground_truth
21528         1            1
14033         1            0
3770          1            1
16734         1            1
20867         1            0
26342         1            1
687           1            1
7501          1            1
15543         1            1
13239         1            0
3403          1            1

[[2]]
          preds ground_truth
5278          1            1
4745          1            1
12622         1            0
26877         1            1
441           1            1
20626         1            1

[[3]]
          preds ground_truth
7431          1            1
16675         1            1

[[4]]
[1]       preds ground_truth
 <0 rows> (or 0-length row.names)
  

Я пробовал оба length и nrow , используя следующий формат, но ни один из них не дал неверного количества.

 for (list in GroupedList){
  print(length(list))
}
  

Мне нужен вывод, чтобы иметь возможность проверять и печатать длину каждого списка по отдельности. Причина этого в том, чтобы иметь возможность использовать длину списка в условиях, подобных этому:

 for (list in GroupedList){
  if(length(list) > 0){
     print(list)}
}
  

Может ли кто-нибудь показать мне, как подсчитывать элементы в отдельных списках.

Комментарии:

1. Попробуйте length(list[[1]]) > 0 или nrow(list) > 0 в if условии вместо length(list) > 0 .

Ответ №1:

Я бы предложил такой подход. Вы можете использовать lapply() , поскольку у вас есть список, и привязать результаты с помощью do.call() и rbind() :

 #Data
List <- list(structure(list(preds = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), ground_truth = c(1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 
1L, 0L, 1L)), class = "data.frame", row.names = c("21528", "14033", 
"3770", "16734", "20867", "26342", "687", "7501", "15543", "13239", 
"3403")), structure(list(preds = c(1L, 1L, 1L, 1L, 1L, 1L), ground_truth = c(1L, 
1L, 0L, 1L, 1L, 1L)), class = "data.frame", row.names = c("5278", 
"4745", "12622", "26877", "441", "20626")), structure(list(preds = c(1L, 
1L), ground_truth = c(1L, 1L)), class = "data.frame", row.names = c("7431", 
"16675")), structure(list(preds = integer(0), ground_truth = integer(0)), row.names = character(0), class = "data.frame"))
  

Код:

 #Obtain dim
O <-as.data.frame(do.call(rbind,lapply(List,function(x) dim(x)[1])))
#Format
O$List <- rownames(O)
O <- O[,c(2,1)]
names(O)[2]<-'count'
rownames(O)<-NULL
  

Вывод:

   List count
1    1    11
2    2     6
3    3     2
4    4     0
  

Обновление: здесь другой подход, использующий for()

 #Data
List2 <- list(l1 = list(structure(list(preds = c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), ground_truth = c(1L, 0L, 1L, 1L, 0L, 1L, 
1L, 1L, 1L, 0L, 1L)), class = "data.frame", row.names = c("21528", 
"14033", "3770", "16734", "20867", "26342", "687", "7501", "15543", 
"13239", "3403"))), l2 = list(structure(list(preds = c(1L, 1L, 
1L, 1L, 1L, 1L), ground_truth = c(1L, 1L, 0L, 1L, 1L, 1L)), class = "data.frame", row.names = c("5278", 
"4745", "12622", "26877", "441", "20626"))), l3 = list(structure(list(
    preds = c(1L, 1L), ground_truth = c(1L, 1L)), class = "data.frame", row.names = c("7431", 
"16675"))), l4 = list(structure(list(preds = integer(0), ground_truth = integer(0)), row.names = character(0), class = "data.frame")))
  

Код:

 #Create empty list to save results
elist <- list()
#Loop
for(i in 1:length(List2))
{
  #Check dim
  if(dim(List2[[i]][[1]])[1]>0)
  {
    df <- data.frame(name=names(List2[i]),count=dim(List2[[i]][[1]])[1])
    elist[[i]] <- df
  }
}
#Now bind
O <- do.call(rbind,elist)
  

Вывод:

   name count
1   l1    11
2   l2     6
3   l3     2
  

Комментарии:

1. @geds133 не будет таким же, если после получения измерений вы отфильтруете те, которые имеют ноль?

2. Я не могу понять, где все, что я определил, находится в вашем ответе. Также с этим ответом я все еще могу сохранить номер списка?

3. Кроме того, это сохраняет имя списка и подсчитывает переменные, однако я не понимаю, как я могу использовать этот новый вывод условно для редактирования исходного списка списков.

4. @geds133 Я добавил обновление, пожалуйста, проверьте, конечный результат — это фрейм данных, из которого вы можете извлекать значения для выполнения других задач.

5. Компьютер не работает, проверит при резервном копировании.

Ответ №2:

Короткая версия:

  sapply(GroupedList, nrow)
  

Комментарии:

1. Или Map(nrow,GroupedList)

2. для работы функции отображения tidyverse вам нужно сначала перейти к вектору списков, а затем к функции nrow map(GroupedList, nrow)