如何将rowSums和ifelse与mutate结合使用

时间:2018-04-21 04:16:38

标签: r if-statement dplyr mutate

我需要合并yz才能创建新变量。我的数据如下:

rowSums

如果ifelse,并且boss var1 var2 var3 newvar 1 NA NA 3 NA 1 2 3 3 8 2 NA NA NA 0 2 NA NA NA 0 2 NA NA NA 0 1 1 NA 2 3 boss==1中有多个缺失值,var1应为var3,否则,应该是newvar

的结果

如果NAvar1+var2+var3应自动boss==2

到目前为止,我已经能够使用newvar来解决部分问题:

0

然而,我正在努力将两者结合起来。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

以下是case_when的一个选项,我们在其中创建一个索引(' i1'),用于计算行中NA元素的数量。索引在case_when中用于创建逻辑条件以分配值

df %>% 
    mutate(i1 = rowSums(is.na(.[-1]))) %>% 
    mutate(newvar = case_when(i1 > 1 & boss==1 ~ NA_integer_,
                          boss==2 ~ 0L, 
                          i1 <=1 & boss != 2~ as.integer(rowSums(.[2:4], na.rm = TRUE)))) %>%
    select(-i1)
#   boss var1 var2 var3 newvar
#1    1   NA   NA    3     NA
#2    1    2    3    3      8
#3    2   NA   NA   NA      0
#4    2   NA   NA   NA      0
#5    2   NA   NA   NA      0
#6    1    1   NA    2      3

base R中,可以通过创建索引而不使用任何ifelse来完成此操作

i1 <- df$boss != 2
tmp <- i1 * df[-1]
df$newvar <- NA^(rowSums(is.na(tmp)) > 1 & i1) * rowSums(tmp, na.rm = TRUE)
df$newvar
#[1] NA  8  0  0  0  3

数据

df <- structure(list(boss = c(1L, 1L, 2L, 2L, 2L, 1L), var1 = c(NA, 
 2L, NA, NA, NA, 1L), var2 = c(NA, 3L, NA, NA, NA, NA), var3 = c(3L, 
 3L, NA, NA, NA, 2L)), .Names = c("boss", "var1", "var2", "var3"
 ), row.names = c(NA, -6L), class = "data.frame")

答案 1 :(得分:1)

base-R使用apply的解决方案可以是:

df$newvar <- apply(df,1, function(x){
  #retVal = NA
  if(x["boss"]==2){
    0
  } else if(sum(is.na(x[-1])) > 1){
    NA
  } else{
    sum(x[-1], na.rm = TRUE)
  }
})

#   boss var1 var2 var3 newvar
# 1    1   NA   NA    3     NA
# 2    1    2    3    3      8
# 3    2   NA   NA   NA      0
# 4    2   NA   NA   NA      0
# 5    2   NA   NA   NA      0
# 6    1    1   NA    2      3

数据:

df <- read.table(text = 
"boss var1 var2 var3
1    NA   NA   3    
1     2    3   3    
2    NA    NA  NA   
2    NA    NA  NA   
2    NA    NA  NA   
1    1     NA  2",
header = TRUE, stringsAsFactors = FALSE)