В «dplyr`, когда используется «pivot_wide», я хочу одновременно заменить «NA»

#r #dplyr #pivot #tidyverse

#r #dplyr #стержень #tidyverse

Вопрос:

В dplyr случае использования pivot_wide я хочу одновременно заменить «NA». Вот код ,как показано ниже, они не работают. Кто-нибудь может помочь? Спасибо!

 library(tidyverse) test_data lt;- data.frame(category=c('A','B','A','B','A','B','A','B'),  sub_category=c('a1','b1','a2','b2','a1','b1','a2','b2'),  sales=c(1,2,4,5,8,1,4,6))  #method1: Error: Can't convert lt;doublegt; to lt;listgt;. test_data %gt;% pivot_wider(names_from = 'category',  values_from = 'sales',  values_fill = 0) %gt;% unnest()    #method2: code can't run test_data %gt;% pivot_wider(names_from = 'category',  values_from = 'sales') %gt;% unnest() %gt;%   as.data.frame() %gt;%   mutate(across(where(is.numeric),function(x) stringr::str_replace('NA',0)))  

Комментарии:

1. values_fill Аргументом должен быть список формы values_fill = list(column_name = value) .

2. Я не могу запустить ни один из ваших кодов. Не могли бы вы, пожалуйста, показать результат, который вы хотите получить для ввода образца?

3. Кроме того, просто для общего знания, пропущенные значения NA -это не то же самое, что строки "NA" .

4. @Gregor Thomas Я попробовал «values_fill = список(имя столбца = значение)», но это не может работать,не могли бы вы помочь показать весь код ? Спасибо!

5. Я бы с удовольствием показал вам код, но я не знаю, какова ваша цель. Не могли бы вы, пожалуйста, показать результат, который вы хотите, в соответствии с моим 2-м комментарием?

Ответ №1:

 test_data %gt;%   pivot_wider(names_from = 'category', values_from = 'sales',   values_fn = list, values_fill = list(0)) %gt;%  unnest(c(A, B))  # A tibble: 8 x 3  sub_category A B  lt;chrgt; lt;dblgt; lt;dblgt; 1 a1 1 0 2 a1 8 0 3 b1 0 2 4 b1 0 1 5 a2 4 0 6 a2 4 0 7 b2 0 5 8 b2 0 6  

Ответ №2:

Это то, чего ты хочешь?

 test_data %gt;%   pivot_wider(names_from = 'category',  values_from = 'sales') %gt;%   unnest(cols = c(A, B)) %gt;%   mutate(across(where(is.numeric), replace_na, 0))