当NA为全部或部分时,条件语句会给出不同的结果。

问题描述 投票:0回答:1

我有这个数据集,其中有6个变量,包含正数、负数或NA。需要根据这些变量的值以如下方式生成一个新的列。

P 如果6个变量中的任何一个都包含一个正数结果

N 如果6个变量中没有一个包含正数结果。

NA 如果6个变量中的所有变量都有 NA.

MWE

var1 <- c('var1P', 'var1N', 'var1P', 'var1P', NA, 'var1N')
var2 <- c('var2N', 'var2N', 'var2N', 'var2P', NA, 'var2N')
var3 <- c('var3N', 'var3N', 'var3N', 'var3P', NA, 'var3N')
var4 <- c('var4P', 'var4N', 'var4P', 'var4P', NA, 'var4N')
var5 <- c(NA, 'var5N', 'var5N', 'var5P', NA, 'var5N')
var6 <- c(NA, NA, 'var6N', 'var6P', NA, 'var6N')
No <- seq(1:6)

df <- data.frame(No, var1, var2, var3, var4, var5, var6)

编码

dfnew <- df %>%
  dplyr::mutate(varif = ifelse(var1 == 'var1P' | var2 == 'var2P' | var3 == 'var3P' | var4 == 'var4P' | var5 == 'var5P' | var6 == 'var6P', 'P', 'N'))

产量

  No  var1  var2  var3  var4  var5  var6 varif
   1 var1P var2N var3N var4P  <NA> <NA>      P
   2 var1N var2N var3N var4N var5N  <NA>   <NA>
   3 var1P var2N var3N var4P var5N var6N     P
   4 var1P var2P var3P var4P var5P var6P     P
   5  <NA> <NA> <NA> <NA> <NA> <NA>        <NA>
   6 var1N var2N var3N var4N var5N var6N     N

问题

varif 2号应改为: N 而不是 NA 以使其与5号不同,在5号中,所有的数值都是。NA.

审判失败

impMe <- function (var1, var2, var3, var4, var5, var6) {
  x <-ifelse(is.na(var1) & is.na(var2) & is.na(var3) & is.na(var4) & is.na(var5) & is.na(var6), NA,
             ifelse (var1 == 'var1P' | var2 == 'var2P' | var3 == 'var3P' | var4 == 'var4P' | var5 == 'var5P' | var6 == 'var6P','P','N'))
  return(x)
}

dfnew <- df %>%
  dplyr::mutate(varif = impMe(var1, var2, var3, var4, var5, var6))

  No  var1  var2  var3  var4  var5  var6 varif
   1 var1P var2N var3N var4P  <NA> <NA>      P
   2 var1N var2N var3N var4N var5N  <NA>   <NA>
   3 var1P var2N var3N var4P var5N var6N     P
   4 var1P var2P var3P var4P var5P var6P     P
   5  <NA> <NA>   <NA> <NA>   <NA> <NA>    <NA>
   6 var1N var2N var3N var4N var5N var6N     N
function if-statement tidyverse mutate
1个回答
0
投票

在tidyverse中,有一个叫做 case_when()它做的是多case ifelse()。我注释了 NA 因为它不需要作为 case_when() 将返回 NA 如果所有提到的条件都不符合,这一行就没有必要了!

dfnew <- df %>%
  dplyr::mutate(varif = case_when (
                  ## is.na(var1) & is.na(var2) & is.na(var3) & is.na(var4) & is.na(var5) & is.na(var6) ~ NA,
                  var1 == 'var1P' | var2 == 'var2P' | var3 == 'var3P' | var4 == 'var4P' | var5 == 'var5P' | var6 == 'var6P' ~ 'P',
                  !is.na(var1) | !is.na(var2) | !is.na(var3) | !is.na(var4) | !is.na(var5) | !is.na(var6) ~ 'N'
                  ))

輸出

enter image description here

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.