R - итеративный цикл по спискам и создание кадра данных - PullRequest
0 голосов
/ 02 июля 2018

У меня длинный список списков (> 100 КБ), и мне нужно итеративно перебирать каждый список и извлекать «id» - что я могу легко сделать, построив lapply в цикле for.

Вот пример списков:

l1 <- list(id="002e2b45555652749339ab9c34359fb6", key="2", value="xx")
l2 <- list(id="002e2b433226527493jsab9c34353fb6", key="4", value="zz")
l3 <- list(list1, list2)

Я делаю цикл с:

for(i in 1:20) {
  lapply(l3$id[[i]][1], function (x) print(x))
}

По сути, печать всех элементов каждого списка идентификатора - что приятно. В конечном итоге я хочу построить матрицу / фрейм данных со всеми «идентификаторами» в строках. Что меня беспокоит, так это то, что печать в моем цикле работает хорошо, распечатывая все идентификаторы из всех списков - хотя я не могу связать свои строки с кадром данных или матрицей и т. Д. Я пробовал что-то вроде - не делаю то, что хочу (хотя не получаю ошибку и т. д.)

for(i in 1:20) {
  lapply(l3$id[[i]][1], function (x) rbind(x))
}

ТАК что желаемый результат должен быть (предпочтительно в виде кадра данных).

[1] "002e2b45555652749339ab9c3400cc52"
[1] "002e2b45555652749339ab9c34040525"

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

с использованием базы R:

s=aggregate(.~ind,stack(setNames(l3,1:length(l3))),identity)
  ind                         values.1 values.2 values.3
1   1 002e2b45555652749339ab9c34359fb6        2       xx
2   2 002e2b433226527493jsab9c34353fb6        4       zz

если вам просто нужны идентификаторы

s$values[,1]
[1] "002e2b45555652749339ab9c34359fb6" "002e2b433226527493jsab9c34353fb6"
0 голосов
/ 02 июля 2018

Если вы хотите вектор идентификаторов, вы можете сделать

sapply(l3, "[[", "id")

или с использованием функций Tidyverse

purrr::map_chr(l3, "id")

Нет необходимости в петлях для подобных вещей в R.

...