#r #purrr
#r #мурлыканье
Вопрос:
Я только учусь работать со списками в R, и я довольно близко подобрался к тому, что хочу делать. Я поднимаю руку, чтобы немного подтолкнуть в правильном направлении:
my_data <-
data.frame(group = c(sample(c('A', 'B', 'C'), 20, replace = TRUE)),
x = runif(100, 0, 10)) %>%
group_by(group) %>%
nest() %>%
mutate(number = sample(3:7, 3))
Что я хотел бы сделать:
На самом деле просто. Я хочу добавить новый вектор во вложенный список («данные»), содержащий соответствующее значение из вектора «число». Так, например, первые 5 строк первого элемента в списке будут выглядеть примерно так:
head(my_data$data[[1]],5) %>% mutate(y=4)
Но я не знаю, как это сделать! (Очевидно, я жестко запрограммировал приведенный выше пример.)
Я пытался:
Множество перестановок unlist, unnest, map, pluck. Я записал не все, что пробовал.
Комментарии:
1. В базовом R вы могли бы использовать
Map
,my_data$data <- Map(cbind, my_data$data, y = my_data$number)
Ответ №1:
Если я вас правильно понял, вы пытаетесь создать функцию, которая добавляет новый столбец:
require(tidyverse)
my_data <- my_data %>%
mutate(data = map(data, function(x) {
x %>%
mutate(y = 4)
}))
Результат:
my_data$data[1]
[[1]]
# A tibble: 30 x 2
x y
<dbl> <dbl>
1 5.97 4
2 7.44 4
3 9.96 4
4 9.98 4
5 0.0933 4
6 1.45 4
7 9.78 4
8 6.88 4
9 5.10 4
10 6.68 4
Комментарии:
1. Спасибо за это. Я ожидал, что функция справится с задачей лучше всего, и это помогает! На самом деле, реальный вопрос был немного сложнее: значение, которое я хотел предоставить, было другим вектором в родительском фрейме данных. В итоге я решил это другим способом, но ваш способ лучше.
2. Добро пожаловать, и я рад, что смог помочь :). Не забывайте, что вы всегда можете просто
nest
выбрать нужные переменные и оставить переменные вне вложенности для вашего использования (mtcars %>% nest(-cyl, -vs)
, cyl и vs не будут вложенными).3. на самом деле это было частью моего решения. я хотел присвоить идентификационные номера членам категории. Итак, я вложил по категориям, присвоил номера строк с помощью
rowname_to_column
, а затем я хотел присвоить эти номера строк всем вложенным элементам. Это была первоначальная проблема, в которой я застрял. Я решил это довольно грубо (я новичок в этом). 🙂
Ответ №2:
Используйте purrr::map2
в случае, если у вас есть два вектора для перебора
library(tidyverse)
my_data <- my_data %>% mutate(data_mod=map2(data,number,cbind))
Комментарии:
1. Спасибо! В основном это сработало. Два последующих шага. 1) Я получаю это предупреждение: «В bind_rows_(x, .id) : Неравные уровни факторов: принуждение к символу). 2) Для каждого элемента в списке я также получаю это предупреждение: «В bind_rows_(x, .id) : привязка символа и вектора факторов, приведение к символьному вектору». Наконец, есть ли способ присвоить имя новому вектору в data_mod?
2. @Стив Попробуй
my_data %>% mutate(data_mod=map2(data,number,data.frame,stringsAsFactors = FALSE) %>% map(setNames,nm=c('x','y')))
3. Я собираюсь попробовать это, когда у меня будет шанс, потому что я думаю, что смогу чему-то научиться из этого. Пожалуйста, ознакомьтесь с моими комментариями выше. Спасибо!