Добавить новый вектор во вложенный список

#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. Я собираюсь попробовать это, когда у меня будет шанс, потому что я думаю, что смогу чему-то научиться из этого. Пожалуйста, ознакомьтесь с моими комментариями выше. Спасибо!