根据条件值创建一个包含mutate的新列

时间:2017-09-25 20:25:10

标签: r dplyr

我的数据框 df 包含ID,X和Y

ID = c(1,1,2,2)
X = c(1,0.4,0.8,0.1) 
Y = c(0.5,0.5,0.7,0.7)
df <- data.frame(ID,X,Y)

ID   X   Y
 1 1.0 0.5
 1 0.4 0.5
 2 0.8 0.7
 2 0.1 0.7

我想获得两个新专栏:

    当X大于Y时,
  • Xg 等于X,否则
  • 当X小于Y时,
  • Xl 等于X,否则为NA。也就是说,

    ID   X   Y  Xg  Xl
     1 1.0 0.5 1.0  NA
     1 0.4 0.5  NA 0.4
     2 0.8 0.7 0.8  NA
     2 0.1 0.7  NA 0.1
    

3 个答案:

答案 0 :(得分:3)

即使XY中存在NA,

下面也应该有效
library(dplyr)
df %>%
  mutate(Xg = ifelse(X > Y, X, NA),
         Xl = ifelse(X < Y, Y, NA))

如果您想使用if_else中的dplyr,则必须将NA转换为数字。 if_elseifelse更严格,因为它会检查TRUEFALSE值是否属于同一类型:

df %>%
  mutate(Xg = if_else(X > Y, X, as.numeric(NA)),
         Xl = if_else(X < Y, Y, as.numeric(NA)))

<强>结果:

  ID   X   Y  Xg  Xl
1  1 1.0 0.5 1.0  NA
2  1 0.4 0.5  NA 0.5
3  2 0.8 0.7 0.8  NA
4  2 0.1 0.7  NA 0.7
5  3  NA 1.0  NA  NA
6  3 3.0  NA  NA  NA

数据:

ID = c(1,1,2,2,3,3)
X = c(1,0.4,0.8,0.1,NA,3) 
Y = c(0.5,0.5,0.7,0.7,1,NA)
df <- data.frame(ID,X,Y)

答案 1 :(得分:2)

一些普通的旧R索引和子集呢?

ID <- c(1,1,2,2, 3, 3)
X <- c(1,0.4,0.8,0.1, NA, 2) 
Y <-  c(0.5,0.5,0.7,0.7, 2, NA)
Xg <- Xl <- rep(NA_real_, length(ID))
Xg[which(X > Y)] <- X[which(X > Y)]
Xl[which(X < Y)] <- X[which(X < Y)]
data.frame(ID, X, Y, Xg, Xl)

注意:我假设如果缺少X或Y,则Xg和Xl应为NA。

答案 2 :(得分:1)

为了完整性以及在编辑之前最初使用data.table()的问题(因为我喜欢简洁的代码),这里是使用data.table的“单行”正确更新

library(data.table)
setDT(df)[X > Y, Xg := X][X < Y, Xl := X][]
   ID   X   Y  Xg  Xl
1:  1 1.0 0.5 1.0  NA
2:  1 0.4 0.5  NA 0.4
3:  2 0.8 0.7 0.8  NA
4:  2 0.1 0.7  NA 0.1
5:  3  NA 1.0  NA  NA
6:  3 3.0  NA  NA  NA

(使用useR的数据)

NA会自动处理,因为只会更新匹配的行。