使用r有条件地填充新添加的列

时间:2018-11-21 11:06:45

标签: r

我有一个如下所示的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,并在col4中填充0。

如果col1 == 2,则将col2复制到col4,并在col3中填充0。

最后我可以看到一个df。

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

任何好的软件包或基本的R函数都可以做到这一点?

3 个答案:

答案 0 :(得分:2)

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

如果col1既不是1也不是2,这将用NA填充col3和col4。ifelse语句(例如来自Anatolii的语句)也是可能的,但我认为它不应该那么笼统。

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)))

答案 1 :(得分:1)

您可以轻松使用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

答案 2 :(得分:0)

我认为您可能会通过寻找软件包或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中;与col4which(col1 == 2)相同。