R - добавить новый идентификатор для каждого фрейма данных в списке (используя apply или dplyr) - PullRequest
0 голосов
/ 28 июня 2018

Для каждого фрейма данных я хочу уникальный идентификатор. Я уже могу сделать это, используя цикл for, но я пытаюсь сделать мой код более R-подобным, и я чувствую, что это можно сделать с помощью функции apply или dplyr. Мой текущий пример кода:

df1 <- data.frame(x="ayyy", y=rnorm(5))
df2 <- data.frame(x="lmao", y=rnorm(6))
l1 <- list(df1,df2)

for (i in seq_along(l1)){
  l1[[i]] <- cbind(l1[[i]],i)
}


l1

Я также был бы признателен за другие методы достижения этой цели.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Использование mapply:

mapply(cbind, l1, "i" = seq_along(l1), SIMPLIFY = F)

Выход:

[[1]]
     x           y i
1 ayyy  1.52049119 1
2 ayyy  0.79595595 1
3 ayyy -1.45352957 1
4 ayyy  0.09839542 1
5 ayyy -0.59377098 1

[[2]]
     x           y i
1 lmao  0.88828117 2
2 lmao  0.05307042 2
3 lmao -0.55702363 2
4 lmao  0.43839704 2
5 lmao  0.15260816 2
6 lmao -0.16461758 2
0 голосов
/ 28 июня 2018

Для этого можно использовать purrr::imap, который передает индекс каждого элемента в списке в качестве второго аргумента .y функции:

library(purrr); library(dplyr)

imap(l1, ~ mutate(.x, i = .y))

#[[1]]
#     x         y i
#1 ayyy -1.761054 1
#2 ayyy -2.123735 1
#3 ayyy -1.525554 1
#4 ayyy -1.756684 1
#5 ayyy -1.686749 1

#[[2]]
#     x           y i
#1 lmao  0.05505287 2
#2 lmao -0.33393283 2
#3 lmao -1.91543274 2
#4 lmao -1.03591717 2
#5 lmao  0.67857511 2
#6 lmao  0.61049477 2

Что эквивалентно базовому решению R с использованием Map:

Map(function(.x, .y) mutate(.x, i = .y), l1, seq_along(l1))

Обратите внимание, с помощью lapply или apply у вас нет возможности отслеживать индекс каждого элемента во время их циклического просмотра.

...