Почему не удается использовать каналы и карту в списке фреймов данных? - PullRequest
3 голосов
/ 01 июня 2019

У меня есть тиблы, вложенные в список со столбцом идентификаторов. Я хотел бы запускать анонимные функции для каждого вложенного элемента. Тем не менее, когда я использую канал, чтобы обратиться к моей основной df, а затем к списку, который содержит мою карту данных, не работает.

# Creating the df
df_nested <- iris %>% group_by(Species) %>% nest()

# Does not work
# df_nested %>% 
# map(data, nrow)

# Works
map(df_nested$data, nrow)

Я хотел бы понять, почему код не работает с использованием канала.

Ответы [ 2 ]

2 голосов
/ 01 июня 2019

Всегда лучше использовать mutate при использовании nested данных:

df_nested %>% 
   mutate(Nrow=map(data,nrow)) %>% 
   unnest(Nrow)
# A tibble: 3 x 3
  Species    data               Nrow
  <fct>      <list>            <int>
1 setosa     <tibble [50 x 4]>    50
2 versicolor <tibble [50 x 4]>    50
3 virginica  <tibble [50 x 4]>    50
2 голосов
/ 01 июня 2019

Это потому, что при использовании каналов (%>%) первый аргумент по умолчанию передается из LHS.

Когда вы делаете

df_nested %>% map(data, nrow)

вы получите

#$Species
#[1] ".x[[i]]" "nrow"   

#$data
#[1] ".x[[i]]" "nrow"   

#Warning messages:
#1: In .f(.x[[i]], ...) : data set ‘.x[[i]]’ not found
#2: In .f(.x[[i]], ...) : data set ‘nrow’ not found
#3: In .f(.x[[i]], ...) : data set ‘.x[[i]]’ not found
#4: In .f(.x[[i]], ...) : data set ‘nrow’ not found

, что совпадает с

map(df_nested, data, nrow)

Если вы хотите использовать трубы, вам может понадобиться

df_nested$data %>% map(nrow)

#[[1]]
#[1] 50

#[[2]]
#[1] 50

#[[3]]
#[1] 50
...