R Добавить столбец во вложенных наборах данных. - PullRequest
0 голосов
/ 06 декабря 2018

Как часть более сложной процедуры, я оказался потерянным в этом отрывке.Ниже приведен воспроизводимый пример того, с чем я имею дело.Мне нужно добавить столбец в каждый вложенный набор данных с тем же номером внутри, но разным числом между ними.В частности, число должно быть тем, что написано в c1$Age.Код cbind(k, AgeGroup = 3) предназначен только для демонстрации.На самом деле, когда я использовал cbind(k, AgeGroup = Age), R выдает мне следующую ошибку Error in mutate_impl(.data, dots): Evaluation error: arguments imply differing number of rows: 5, 2.

library(dplyr)
library(purrr)
library(magrittr)
library(tidyr)

c <- read.table(header = TRUE, text = "Age Verbal  Fluid  Speed 
2     89     94    103    
1     98     88    100    
1    127    115    102    
2     83    101     71    
2    102     92     87   
1     91     97    120   
1     96    129     98   
2     79     92     84    
2    107     95    102")

c1 <- c %>% 
  group_by(Age) %>% 
  nest() %>% 
  dplyr::mutate(db = data %>% map(function(k) cbind(k, AgeGroup = 3)))

#> c1
# A tibble: 2 x 3
#    Age data             db                  
#  <int> <list>           <list>              
#1     2 <tibble [5 x 3]> <data.frame [5 x 4]>
#2     1 <tibble [4 x 3]> <data.frame [4 x 4]>

Это то, что у меня сейчас:

#> c1$db
#[[1]]
#  Verbal Fluid Speed AgeGroup
#1     89    94   103        3
#2     83   101    71        3
#3    102    92    87        3
#4     79    92    84        3
#5    107    95   102        3
#
#[[2]]
#  Verbal Fluid Speed AgeGroup
#1     98    88   100        3
#2    127   115   102        3
#3     91    97   120        3
#4     96   129    98        3

Это то, что я хотел быполучить.

#> c1$db
#[[1]]
#  Verbal Fluid Speed AgeGroup
#1     89    94   103        2
#2     83   101    71        2
#3    102    92    87        2
#4     79    92    84        2
#5    107    95   102        2
#
#[[2]]
#  Verbal Fluid Speed AgeGroup
#1     98    88   100        1
#2    127   115   102        1
#3     91    97   120        1
#4     96   129    98        1

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Мы можем использовать map2 для циклического перебора столбцов Age и data и обновления столбцов data, используя mutate.

library(dplyr)
library(purrr)
library(magrittr)
library(tidyr)

c1 <- c %>% 
  group_by(Age) %>% 
  nest()

c2 <- c1 %>%
  mutate(data = map2(data, Age, ~mutate(.x, AgeGroup = .y)))

c2$data
# [[1]]
# # A tibble: 5 x 4
#   Verbal Fluid Speed AgeGroup
#    <int> <int> <int>    <int>
# 1     89    94   103        2
# 2     83   101    71        2
# 3    102    92    87        2
# 4     79    92    84        2
# 5    107    95   102        2
# 
# [[2]]
# # A tibble: 4 x 4
#   Verbal Fluid Speed AgeGroup
#    <int> <int> <int>    <int>
# 1     98    88   100        1
# 2    127   115   102        1
# 3     91    97   120        1
# 4     96   129    98        1
0 голосов
/ 06 декабря 2018

Вы можете заменить map на map2 и таким образом поддерживать знание соответствующего значения Age:

c1 <- c %>% group_by(Age) %>% nest() %>% 
  dplyr::mutate(db = data %>% map2(Age, function(k, age) cbind(k, AgeGroup = age)))
c1$db
# [[1]]
#   Verbal Fluid Speed AgeGroup
# 1     89    94   103        2
# 2     83   101    71        2
# 3    102    92    87        2
# 4     79    92    84        2
# 5    107    95   102        2
#
# [[2]]
#   Verbal Fluid Speed AgeGroup
# 1     98    88   100        1
# 2    127   115   102        1
# 3     91    97   120        1
# 4     96   129    98        1

Когда вы пытались cbind(k, AgeGroup = Age) напрямую, проблема заключалась в том, чтоAge был вектором 2:1, а не одним соответствующим значением.

...