r - 在 R 中,如何根据条件创建新的变量

我正在尝试根据一些条件创建一个新的变量。

我的数据看起来像


a b


1 NA


2 3


3 3


NA 2


NA NA



我想要的是一个变量 c,这样

  • a 不是 NA 时,bNAc = a

  • aNA 时,b 不是 NAc = b

  • aNA 时,bNAc = NA

  • a 不是 NA 时,b 不是 NA,而 a == bc = a

  • a 不是 NA 时,b 不是 NA,而 a!= bc ="multiple_values"

我该怎么做?

我想 ifelse() 不能做我想要的。

时间:

除了其中一个条件,即'a ','b '中的非NA元素,并且它们彼此不相等,所有其他条件都通过合并来满足。 因此,我们可以根据最后一个条件生成一个case_when来生成"multiple_values ",并通过应用coalesce来生成所有其他条件


library(dplyr)


df1 %>%


 mutate(c = case_when(!is.na(a) &!is.na(b) & a!= b ~"multiple_values", 


 TRUE ~ as.character(coalesce(a, b))))


# a b c


#1 1 NA 1


#2 2 3 multiple_values


#3 3 3 3


#4 NA 2 2


#5 NA NA <NA>



数据


df1 <- structure(list(a = c(1L, 2L, 3L, NA, NA), b = c(NA, 3L, 3L, 2L, 


 NA)), class ="data.frame", row.names = c(NA, -5L))



在基本 R 中,你可以使用 within


dat <- within(dat, {


 c <- NA


 c[!is.na(a) & is.na(b)] <- a[!is.na(a) & is.na(b)]


 c[is.na(a) &!is.na(b)] <- b[is.na(a) &!is.na(b)]


 # # c[is.na(a) & is.na(b)] <- NA # redundant


 c[!is.na(a) &!is.na(b) & a == b] <- a[!is.na(a) &!is.na(b) & a == b]


 c[!is.na(a) &!is.na(b) & a!= b] <-"multiple_values"


})



dat


# a b c


# 1 1 NA 1


# 2 2 3 multiple_values


# 3 3 3 3


# 4 NA 2 2


# 5 NA NA <NA>



数据: dat <- data.frame(a=c(1:3, NA, NA), b=c(NA, 3, 3, 2, NA))

ifelse可以做你想做的事情,但它只是会有很多嵌套语句


df$c <- with(df, ifelse(!is.na(a) & is.na(b), a, 


 ifelse(is.na(a) &!is.na(b), b, 


 ifelse(is.na(a) & is.na(b), NA, 


 ifelse(!is.na(a) &!is.na(b) & a == b, a,"multiple_values")))))



df


# a b c


#1 1 NA 1


#2 2 3 multiple_values


#3 3 3 3


#4 NA 2 2


#5 NA NA <NA>



这里是另一个基本的R 答案,它使用 mapply 循环,一个简单的函数,并且用 switch 来决定结果。


df1$c <-


 mapply(function(x, y) {


 z <- c(x, y)


 z <- unique(z[!is.na(z)])


 switch(length(z) + 1L, NA, z,"many")


 }, df1$a, df1$b)



返回


df1


 a b c


1 1 NA 1


2 2 3 many


3 3 3 3


4 NA 2 2


5 NA NA <NA>



使用 data.table,你可以:


df1 <- structure(list(a = c(1L, 2L, 3L, NA, NA), b = c(NA, 3L, 3L, 2L, 


 NA)), class ="data.frame", row.names = c(NA, -5L))


library(data.table)


df1 <- as.data.table(df1)


df1[, c:="NONE"]


df1[!is.na(a) & is.na(b), c:=a] 


df1[is.na(a) &!is.na(b), c:=b] 


df1[is.na(a) & is.na(b), c:=NA] 


df1[!is.na(a) &!is.na(b) & a==b, c:=a] 


df1[!is.na(a) &!is.na(b) & a!=b, c:="multiple values"] 



...