Изменять имя столбца Dynami c на основе значений других столбцов - PullRequest
1 голос
/ 15 апреля 2020

Вот как я строю 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_3_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

1 Ответ

1 голос
/ 15 апреля 2020

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...