Вставьте в двоичные столбцы значение другого столбца - PullRequest
2 голосов
/ 08 апреля 2020

Имея такой фрейм данных:

    data.frame(previous = c(1,2,2,1,3,3), `next` = c(1,1,2,3,1,3),
    col1_1 = c(1,0,0,0,0,0),
    col1_2 = c(0,0,0,0,0,0),
    col1_3 = c(0,0,0,1,0,0),
    col2_1 = c(0,1,0,0,0,0),
    col2_2 = c(0,0,1,0,0,0),
    col2_3 = c(0,0,0,0,0,0),
    col3_1 = c(0,0,0,0,1,0),
    col3_2 = c(0,0,0,0,0,0),
    col3_3 = c(0,0,0,0,0,1), id = c(1,2,3,4,5,6), salary = c(30,20,40,10,40,80))

Как можно проверить столбцы, пока они не начнутся с col, вставить значение столбца зарплаты, где 1 существует.

Здесь ожидаемый результат :

    data.frame(previous = c(1,2,2,1,3,3), `next` = c(1,1,2,3,1,3),
    col1_1 = c(30,0,0,0,0,0),
    col1_2 = c(0,0,0,0,0,0),
    col1_3 = c(0,0,0,10,0,0),
    col2_1 = c(0,20,0,0,0,0),
    col2_2 = c(0,0,40,0,0,0),
    col2_3 = c(0,0,0,0,0,0),
    col3_1 = c(0,0,0,0,40,0),
    col3_2 = c(0,0,0,0,0,0),
    col3_3 = c(0,0,0,0,0,80), id = c(1,2,3,4,5,6), salary = c(30,20,40,10,40,80))

Ответы [ 2 ]

4 голосов
/ 08 апреля 2020

Мы можем использовать mutate_at, чтобы применить это к различным столбцам, использовать ifelse и заменить 1 соответствующим значением salary.

library(dplyr)
df %>% mutate_at(vars(starts_with('col')), ~ifelse(. == 1, salary, .))

#  previous next. col1_1 col1_2 col1_3 col2_1 col2_2 col2_3 col3_1 col3_2 col3_3 id salary
#1        1     1     30      0      0      0      0      0      0      0      0  1     30
#2        2     1      0      0      0     20      0      0      0      0      0  2     20
#3        2     2      0      0      0      0     40      0      0      0      0  3     40
#4        1     3      0      0     10      0      0      0      0      0      0  4     10
#5        3     1      0      0      0      0      0      0     40      0      0  5     40
#6        3     3      0      0      0      0      0      0      0      0     80  6     80

Или в базе R:

cols <- grep('^col', names(df))
df[cols] <- lapply(df[cols], function(x) ifelse(x == 1, df$salary, x))
1 голос
/ 08 апреля 2020

С dplyr, используя case_when

library(dplyr)
df %>%
      mutate_at(vars(starts_with('col')), ~ case_when(. == 1 ~ salary, TRUE ~ .))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...