我有一个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功能都可以做到这一点?
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)))
您可以轻松地使用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
我认为你可能通过寻找一个包或一个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)
相同的事情。