R语言 将两个变量组合在一起,包括NA

piok6c0g  于 2023-04-03  发布在  其他
关注(0)|答案(4)|浏览(519)

我尝试将两个二进制变量组合在一起作为一个变量,所以如果一个变量中有0,另一个变量中有1,那么它将是1。这包含NA。示例

a <- c("A", NA, 0)
b <- c("B",0,  1)
c <- c("C", 0, 0)
d <- c("D", 0, 1)
e <- c("E", NA, NA)
aa<- rbind(a,b,c,d,e)
aa <- as.data.frame(aa)

我想把这个代码给予我:

a <- c("A", NA, 0, 0)
b <- c("B",0,  1, 1)
c <- c("C", 0, 0, 0)
d <- c("D", 0, 1, 1)
e <- c("E", NA, NA, NA)
bb<- rbind(a,b,c,d, e)
bb <- as.data.frame(bb)

我觉得这很容易解决。

ie3xauqp

ie3xauqp1#

使用base R,使用rowSums通过将感兴趣的列与1进行比较来创建V4列,然后将“V4”中的值替换为NA,其中第2列和第3列中的一行中存在所有NA

aa$V4 <- rowSums(aa[-1] == 1,  na.rm = TRUE)
aa$V4[rowSums(is.na(aa[2:3])) == 2] <- NA
  • 输出
> aa
  V1   V2   V3 V4
a  A <NA>    0  0
b  B    0    1  1
c  C    0    0  0
d  D    0    1  1
e  E <NA> <NA> NA
o0lyfsai

o0lyfsai2#

你可以像这样使用rowSums。请注意,我之前使用type.convert是因为你的一些列是字符,而它们应该是数字:

library(dplyr)
aa %>% 
  type.convert(as.is = TRUE) %>% 
  mutate(V4 = ifelse(if_all(c(V2, V3), is.na), NA, 
                     rowSums(across(c(V2, V3)), na.rm = TRUE)))

#  V1 V2 V3 V4
#a  A NA  0  0
#b  B  0  1  1
#c  C  0  0  0
#d  D  0  1  1
#e  E NA NA NA
jchrr9hc

jchrr9hc3#

aa$V4 <- as.character(ifelse(rowSums(is.na(aa),na.rm = TRUE)>1,NA,
                rowSums(aa==1,na.rm = TRUE)))
nwlqm0z1

nwlqm0z14#

更新以推广coalesce的想法,我们可以编写一个自定义函数并应用它:

my_function <- function(x, y) {
  case_when(is.na(x) & !is.na(y) ~ y,
            is.na(y) & !is.na(x) ~ x,
            x==1 & y==0 ~ x,
            x==y ~ x,
            x==0 | is.na(x) & y==1 ~ y)
}

aa %>% 
  mutate(V4 = my_function(V2, V3))

#tested with this example dataset: 
V2 <- c(NA, 0, 1)
V3 <- c(NA, 0, 1)

expand.grid(V2, V3) %>% 
  rename(V2 = Var1, V3 = Var2) %>% 
  mutate(V4 = my_function(V2, V3))

输出:

V1   V2   V3   V4
a  A <NA>    0    0
b  B    0    1    1
c  C    0    0    0
d  D    0    1    1
e  E <NA> <NA> <NA>

**第一个答案:**我们可以使用coalesce作为提供的数据:

请注意,如果您更改数据,此操作可能不起作用:规则是列的顺序:0必须在NA之前,1必须在0之前:

library(dplyr)

df %>% 
  mutate(V4 = coalesce(V3, V2))

  V1   V2   V3   V4
a  A <NA>    0    0
b  B    0    1    1
c  C    0    0    0
d  D    0    1    1
e  E <NA> <NA> <NA>

相关问题