Я чувствую, что у меня есть хорошее представление о data.frames и о том, как они работают, но некоторые аспекты списков меня путают.Понимание поведения списка
Вот некоторые воспроизводимые данные для запуска:
list_a <- structure(list(`one` = structure(list(
words = c("a", "b","c", "d", "e", "f")), .Names = "words", class = "data.frame", row.names = c(NA,-6L)),
`two` = structure(list(words = c("a","s","t","z")), .Names = "words", class = "data.frame", row.names = c(NA, -4L))),
.Names = c("one", "two"))
Это дает нам:
list_a
$one
words
1 a
2 b
3 c
4 d
5 e
6 f
$two
words
1 a
2 s
3 t
4 z
Теперь я хочу, чтобы перебрать список, чтобы вернуть некоторые из результатов в data.frames.
list <- list()
for(i in list_a){list <- append(list, list_a$i$words)}
Это результат не дает результатов в списке. ни делает:
for(i in list_a){list <- append(list, list_a[[i]]$words)}
Error in list_a[[i]] : invalid subscript type 'list'
Я думал, возможно, причина моя первая петля не работает, что я использовал list_a$i$words
без определения я как правильные имена. Так что я пробовал:
for(i in names(list_a)){list <- append(list, list_a$i$words)}
Это все еще дает мне список длины 0.
Так что я не понимаю, почему попытки я попытался дать техника его подводит результаты я ожидал, я не знаю, почему, используя индексы дал мне ошибку и в конце концов я понял, правильный синтаксис:
for(i in list_a){list2 <- append(list2, i$words)}
Однако я не знаю, почему это работает при использовании метода имен не?
Не добавляйте к объекту в цикле 'for'. Положитесь на предварительное выделение (или используйте функции циклирования, такие как 'lapply', которые делают это для вас). Во всяком случае, используйте 'i $ words' вместо' list_a $ i $ words'. Цикл повторяется над элементами списка, т. Е. 'I' содержит элементы списка, а не их индексы. – Roland
Спасибо, любая проницательность по качеству вопроса, как кто-то запустил его, и я подумал из примера данных, чтобы ясность я пометил все коробки? – Olivia