我有一个如下所示的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函数都可以做到这一点?
答案 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
中;与col4
和which(col1 == 2)
相同。