Условно заполните новый добавленный столбец, используя r - PullRequest
0 голосов
/ 21 ноября 2018

У меня df выглядит следующим образом.

> a <- data.frame(col1=c(1, 2),col2=c(10,11))
> a
  col1 col2
1    1   10
2    2   11

Затем я хочу условно заполнить два дополнительных столбца, col3 and col4.

, если col1 == 1, то скопировать col2в col3 и заполните 0 в col4.

, если col1 == 2, затем скопируйте col2 в col4 и заполните 0 в col3.

Наконец, яможно увидеть df.

  col1 col2 col3 col4
1    1   10   10    0  
2    2   11    0   11 

Любые хорошие пакеты или базовая функция R могут сделать это?

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Случай для dplyr:

library(dplyr)

a <- data.frame(col1=c(1, 2),col2=c(10,11))

a %>% 
  mutate(col3=case_when(col1==1 ~ col2,
                        col1==2 ~ 0),
         col4=case_when(col1==2 ~ col2,
                        col1==1 ~ 0))
>  col1 col2 col3 col4
>1    1   10   10    0
>2    2   11    0   11

Это заполнит col3 и col4 NA, если col1 не равно ни 1, ни 2. Оператор ifelse, такой как Анатолий, являетсятакже возможно, но, по моему мнению, это не должно быть так вообще.

library(dplyr)

a <- data.frame(col1=c(1, 2),col2=c(10,11))

a %>% 
  mutate(col3=ifelse(col1==1, col2,
                     ifelse(col1==2, 0, NA)),
         col4=ifelse(col1==1, 0, 
                     ifelse(col1==2, col2, NA)))
0 голосов
/ 21 ноября 2018

Я думаю, что вы, возможно, слишком усложняете его, ища пакет или if-else .... Простой индекс должен сделать это.

col1 <- c(1,2)
col2 <- c(10,11)
a <- data.frame(col1,col2,col3 = 0, col4 = 0)

a$col3[which(col1 == 1)] <- col2[which(col1 == 1)]
a$col4[which(col1 == 2)] <- col2[which(col1 == 2)]

приводит к

  col1 col2 col3 col4
1    1   10   10    0
2    2   11    0   11

Оператор which(col1 == 1) объявляет, что для каждой строки col1, равной 1, вы копируете эту строку в col3;то же самое с col4 с использованием which(col1 == 2).

0 голосов
/ 21 ноября 2018

Вы можете легко сделать с помощью оператора ifelse:

library(dplyr)

a <- data.frame(col1=c(1, 2),col2=c(10,11))

a %>% 
  mutate(col3 = ifelse(col1 == 1, col2, 0),
         col4 = ifelse(col1 == 2, col2, 0))

>  col1 col2 col3 col4
1    1   10   10    0
2    2   11    0   11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...