我的数据框 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
我想获得两个新专栏:
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
答案 0 :(得分:3)
即使X
或Y
中存在NA,
library(dplyr)
df %>%
mutate(Xg = ifelse(X > Y, X, NA),
Xl = ifelse(X < Y, Y, NA))
如果您想使用if_else
中的dplyr
,则必须将NA转换为数字。 if_else
比ifelse
更严格,因为它会检查TRUE
和FALSE
值是否属于同一类型:
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
会自动处理,因为只会更新匹配的行。