如果另一个变量等于 R 中的设定值,如何使用来自不同变量的值创建新变量?
How to create a new variable with values from different variables if another variable equals a set value in R?
我有一个复杂的问题,我将尝试通过简化我的数据集来简化它。假设我有 5 个变量:
df$Id <- c(1:12)
df$Date <- c(NA,NA,a,a,b,NA,NA,b,c,c,b,a)
df$va <- c(1.1, 1.4, 2.5, ...) #12 randoms values
df$vb <- c(5.9, 2.3, 4.7, ...) #12 other random values
df$vc <- c(3.0, 3.3, 3.7, ...) #12 more random values
然后我想创建一个新变量,如果日期等于 a、b 或 c,则从 va、vb 或 vc 获取值。我试过嵌套的 if-else,但没有用。我也试过:
df$new[df$date=='a' & !is.na(df$date)] <- df$va
df$new[df$date=='b' & !is.na(df$date)] <- df$vb
df$new[df$date=='c' & !is.na(df$date)] <- df$vc
这在 Date=NA 的新变量中正确地留下了 NA,但是提供的值不是来自 va、vb 或 vc,而是完全来自其他一些值。如果日期为 'a',如何使 df$new 等于 va,如果日期为 'b',则为 vb,如果日期为 'c',如何使 df$new 等于 va ?
您需要 ifelse
函数,它是一个矢量化条件函数:
> x <- c(1, 1, 0, 0, 1)
> y <- c(1, 2, 3, 4, 5)
> z <- c(6, 7, 8, 9, 10)
> ifelse(x == 1, y, z)
[1] 1 2 8 9 5
您必须嵌套调用此函数,如下所示:
> x_1 <- c(1, 1, 0, 0, 1)
> x_2 <- c(1, 1, 1, 0, 1)
> y_1 <- c(1, 2, 3, 4, 5)
> y_2 <- c(6, 7, 8, 9, 10)
> z <- c(0, 0, 0, 0, 0)
> ifelse(x_1 == 1, y_1,
+ ifelse(x_2 == 1, y_2, z)
+ )
[1] 1 2 8 0 5
如果您进行以下修改,您的第二次尝试将会成功:
df$new[df$date=='a' & !is.na(df$date)] <- df$va[df$date=='a' & !is.na(df$date)]
为避免新变量变成列表而不是数字变量,请使用 %in% 代替 ==:
df$new[df$date %in% 'a' & !is.na(df$date)] <- df$va[df$date %in% 'a' & !is.na(df$date)]
我有一个复杂的问题,我将尝试通过简化我的数据集来简化它。假设我有 5 个变量:
df$Id <- c(1:12)
df$Date <- c(NA,NA,a,a,b,NA,NA,b,c,c,b,a)
df$va <- c(1.1, 1.4, 2.5, ...) #12 randoms values
df$vb <- c(5.9, 2.3, 4.7, ...) #12 other random values
df$vc <- c(3.0, 3.3, 3.7, ...) #12 more random values
然后我想创建一个新变量,如果日期等于 a、b 或 c,则从 va、vb 或 vc 获取值。我试过嵌套的 if-else,但没有用。我也试过:
df$new[df$date=='a' & !is.na(df$date)] <- df$va
df$new[df$date=='b' & !is.na(df$date)] <- df$vb
df$new[df$date=='c' & !is.na(df$date)] <- df$vc
这在 Date=NA 的新变量中正确地留下了 NA,但是提供的值不是来自 va、vb 或 vc,而是完全来自其他一些值。如果日期为 'a',如何使 df$new 等于 va,如果日期为 'b',则为 vb,如果日期为 'c',如何使 df$new 等于 va ?
您需要 ifelse
函数,它是一个矢量化条件函数:
> x <- c(1, 1, 0, 0, 1)
> y <- c(1, 2, 3, 4, 5)
> z <- c(6, 7, 8, 9, 10)
> ifelse(x == 1, y, z)
[1] 1 2 8 9 5
您必须嵌套调用此函数,如下所示:
> x_1 <- c(1, 1, 0, 0, 1)
> x_2 <- c(1, 1, 1, 0, 1)
> y_1 <- c(1, 2, 3, 4, 5)
> y_2 <- c(6, 7, 8, 9, 10)
> z <- c(0, 0, 0, 0, 0)
> ifelse(x_1 == 1, y_1,
+ ifelse(x_2 == 1, y_2, z)
+ )
[1] 1 2 8 0 5
如果您进行以下修改,您的第二次尝试将会成功:
df$new[df$date=='a' & !is.na(df$date)] <- df$va[df$date=='a' & !is.na(df$date)]
为避免新变量变成列表而不是数字变量,请使用 %in% 代替 ==:
df$new[df$date %in% 'a' & !is.na(df$date)] <- df$va[df$date %in% 'a' & !is.na(df$date)]