У меня есть список из 3000 элементов. Каждый элемент имеет 18 столбцов и разное количество строк. Я хочу видеть только элементы списка с более чем 50 строками, поэтому я попытался написать код с помощью lapply.
Для одного фрейма данных я пробовал
test <- data_frame[1:nrow(data_frame) > 50, ]
и это сработало. Поэтому я попытался реализовать этот код в функции с помощью lapply:
test <- lapply(data_list, function(x) x[1:nrow(x) > 50, ])
но я получаю сообщение об ошибке: «Ошибка в 1: nrow (x): аргумент длины 0».
Вы знаете, что я делаю неправильно? Спасибо большое за вашу помощь.





sapply(rr, nrow) > 5 создает логический вектор (FALSE, FALSE, FALSE, TRUE, ..., указывающий, какие элементы в rr имеют более пяти строк. Затем этот вектор можно использовать для извлечения этих элементов из списка.
set.seed(1)
rr <- replicate(6,
as.data.frame(matrix(1:(sample(2:6, 1)*2), ncol=2)),
simplify=FALSE)
# Find and extract the dataframes with more than 5 rows
rr[sapply(rr, nrow) > 5]
Я думаю, что причина, по которой lapply() не работает, заключается в том, что nrow() применяется к списку, тогда как его нужно применять к фрейму данных/таблице. Я попытался воспроизвести вашу ситуацию, где есть решение для purrr.
Здесь есть список фреймов данных с разным количеством строк — map() применяет функцию nrow() к каждому элементу в списке, а возвращаемый результат nrow затем проверяется на соответствие критериям >50 — который возвращает логический вектор для индексации по сравнению с исходным список. Подойдет ли это решение для вашей проблемы?
df_1 <- data.frame(matrix(1:3600, nrow = 200, ncol = 18))
df_2 <- data.frame(matrix(1:2700, nrow = 150, ncol = 18))
df_3 <- data.frame(matrix(1:900, nrow = 50, ncol = 18))
your_list <- list(df_1,df_2,df_3)
your_list[purrr::map(your_list,nrow) > 50]
Не могли бы вы объяснить, что вы здесь делаете, @AkselA, и как это решает проблему? См. другой ответ в качестве примера полезного уровня детализации.