繁体   English   中英

根据 R 中不同列的条件创建新变量

[英]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 ,您选择xy并不重要,因为它们的定义是相同的。 因此,您可以改为将其写为if_else(x == y, y, …)并获得相同的结果。 对于您的最后一个条件, ifelse(is.na(y), x, NA) - 只有在x == yx != yis.na(x)is.na(y)时才会达到最终的NA都是FALSE ,这是不可能的。 所以你不需要它。 此时,所有剩余条件都会产生y ,除了一个——当yNA时。 所以我们可以写成一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM