[英]Creating new variable based on conditions of different columns in R
有人可以帮我在 R 中创建一个新变量吗? 我需要告诉 R 这样的事情:
data <- data %>%
mutate(c = if_else(x == y, x, ifelse(x != y, y, ifelse(is.na(x), y, ifelse(is.na(y), x, NA))))
当然,在这种形式下,它不起作用。 如果第一列中的值等于第二列中的值 - 使用第一列中的值,如果它们不相等 - 然后使用第二列中的值,如果第一列中有 NA,但是第二列中有一些值,然后使用第二列中的值。 如果第二列中有 NA,但第一列中有一些值,则使用第一列中的值。 (+ x 和 y 中的值是字符)
这是我希望的新变量“c”的结果:
X | 是的 | c |
---|---|---|
1 | 1 | 1 |
1 | 3 | 3 |
不适用 | 5 | 5 |
6 | 不适用 | 6 |
不适用 | 不适用 | 不适用 |
您实际上可以将其简化为一个if_else()
:
library(dplyr)
data <- data %>%
mutate(c = if_else(is.na(y), x, y))
结果:
x y c
1 1 1 1
2 1 3 3
3 NA 5 5
4 6 NA 6
5 NA NA NA
或者对于相同的结果,使用dplyr::coalesce()
:
data <- data >%
mutate(c = coalesce(y, x))
为什么这有效
对于您的第一个条件, if_else(x == y, x, …)
— 如果x == y
,您选择x
或y
并不重要,因为它们的定义是相同的。 因此,您可以改为将其写为if_else(x == y, y, …)
并获得相同的结果。 对于您的最后一个条件, ifelse(is.na(y), x, NA)
- 只有在x == y
和x != y
和is.na(x)
和is.na(y)
时才会达到最终的NA
都是FALSE
,这是不可能的。 所以你不需要它。 此时,所有剩余条件都会产生y
,除了一个——当y
为NA
时。 所以我们可以写成一个if_else()
来反映这一点。
使用case_when
package 中的dplyr
:
df <- data.frame(x=c(1,1,NA,6,NA),
y=c(1,3,5,NA,NA))
df <- df %>%
mutate(c=case_when(is.na(x) & !is.na(y) ~ y,
!is.na(x) & is.na(y) ~ x,
x==y ~ x,
x!=y ~ y))
Output:
> df
x y c
1 1 1 1
2 1 3 3
3 NA 5 5
4 6 NA 6
5 NA NA NA
试试这个:我们可以使用两次ifelse
和 with coalesce
:
df %>%
mutate(c = ifelse(x==y, x, y),
c = ifelse(is.na(x) | is.na(y), coalesce(x,y), c))
x y c
1 1 1 1
2 1 3 1
3 NA 5 5
4 6 NA 6
5 NA NA NA
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.