Изменить имя динамического столбца на основе значений других столбцов

Вот как я создаю df

df_test <- data.frame(ID = c("1100455", "1100455", "1100464", "1100464"),
                      CATEGORIE = c("10110", "90310", "10110","10140"),
                      RANK =  c( "1", "0" ,"1", "1"),
                      MD =  c("0", "0", "0", "3" ),
                      PROD3 = c(2345.00,1114.58,501.40,125.15))

newvars <- paste("aa",df_test[["CATEGORIE"]],df_test[["RANK"]],df_test[["MD"]],"ta", sep="_")
newvars <- unique(newvars)
newvars
df_test[newvars] <- NA

фактический фреймворк:

       ID CATEGORIE RANK MD   PROD3 aa_10110_1_0_ta aa_90310_0_0_ta aa_10140_1
df_test <- df_test %>% mutate(get(paste0("aa_", CATEGORIE,"_",RANK,"_",MD,"_ta" ) = PROD3 )))
ta 1 1100455 10110 1 0 2345.00 NA NA NA 2 1100455 90310 0 0 1114.58 NA NA NA 3 1100464 10110 1 0 501.40 NA NA NA 4 1100464 10140 1 3 125.15 NA NA NA

Я пытаюсь обновить столбцы на основе значений других столбцов,

df_test <- df_test %>% mutate(get(paste0("aa_", CATEGORIE,"_",RANK,"_",MD,"_ta" ) = PROD3 )))

Мне не удается заставить его работать, интересно, возможно ли это только с помощью mutate или мне нужно использовать отдельную функцию?

Ожидаемые результаты :

       ID CATEGORIE RANK MD   PROD3 aa_10110_1_0_ta aa_90310_0_0_ta aa_10140_1_3_ta
1 1100455     10110    1  0 2345.00          2345.0              NA              NA
2 1100455     90310    0  0 1114.58              NA         1114.58              NA
3 1100464     10110    1  0  501.40           501.4              NA              NA
4 1100464     10140    1  3  125.15              NA              NA          125.15

person krifur    schedule 15.04.2020    source источник


Ответы (1)


Используйте str_c (или paste), чтобы создать новые имена столбцов, а затем pivot_wider его.

library(tidyverse)

df_test %>%
  select_at(vars(-starts_with("aa"))) %>%  ## reset your data
  mutate(name = str_c("aa", CATEGORIE, RANK, MD, "ta", sep = "_"),
         value = PROD3) %>% 
  pivot_wider()

#        ID CATEGORIE RANK MD   PROD3 aa_10110_1_0_ta aa_90310_0_0_ta aa_10140_1_3_ta
# 1 1100455     10110    1  0 2345.00          2345.0              NA              NA
# 2 1100455     90310    0  0 1114.58              NA         1114.58              NA
# 3 1100464     10110    1  0  501.40           501.4              NA              NA
# 4 1100464     10140    1  3  125.15              NA              NA          125.15

spread () edition

Если вы используете spread(), вы можете сохранить строку select_at(), потому что spread() перезаписывает повторяющиеся имена столбцов.

df_test %>%
  mutate(name = str_c("aa", CATEGORIE, RANK, MD, "ta", sep = "_"),
         value = PROD3) %>%
  spread(name, value)
person Darren Tsai    schedule 15.04.2020
comment
Я не могу использовать pivot_wider () с версией R-сервера, которую я использую прямо сейчас, поэтому я думаю, что попробую с spread (), это должно быть похоже, не так ли? Также мне интересно, является ли этот синтаксис mutate специфичным для pivot_wider () здесь, потому что он не работает с простым изменением, например: df_test ‹- df_test%›% mutate (name = str_c (aa, CATEGORIE, RANK, MD, ta, sep = _), value = PROD3) (добавляет два столбца, имя и значение) - person krifur; 15.04.2020
comment
mutate необходимо перед pivot_wider или spread, потому что вам нужно создать столбцы (т.е. name и value в моем коде), чтобы получить имя и значения ячеек выходного столбца. - person Darren Tsai; 15.04.2020