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