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

问题描述 投票:1回答:3

我有一个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功能都可以做到这一点?

r
3个回答
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,这将填充col3和col4与NA's。如果来自Anatolii的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)))

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

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;与col4使用which(col1 == 2)相同的事情。

© www.soinside.com 2019 - 2024. All rights reserved.