【问题标题】:Using ifelse or case_when on a data frame in R在 R 中的数据框上使用 ifelse 或 case_when
【发布时间】:2022-12-07 15:35:59
【问题描述】:

我确信我的问题的解决方案很简单,但我是编码新手,似乎无法在网上找到答案。我正在处理一个由收集和编码的定性数据组成的数据集。数据集包括名为代码 1、代码 2、代码 3、代码 4 的变量,每个受访者可以有多个代码,并且他们都至少有一个代码。我正在尝试添加一个变量来反映给参与者的代码数量。 因此,参与者数据看起来像这样,数值是我们根据他们的回答分配的代码:

ID Code1 Code2 Code3 Code4
1.  5      NA    NA    NA 
2.  7       6    4     NA
3.  5      12    NA    NA

我要包含的变量是名为 count 的变量,如下所示:

ID Code1 Code2 Code3 Code4 Count
1.  5      NA    NA    NA   1
2.  7       6    4     NA   3
3.  5      12    NA    NA   2

第一个参与者的计数为 1,因为他们只收到一个代码,参与者 2 的数字为 3,因为他们有三个代码,而参与者 3 的计数为 2,因为他们只被分配了两个代码。

无论如何,我已经尝试使用 ifelse 函数使用 NA 因为这表明分配的代码更少但是当我尝试使用它时我不能分配超过 2 个结果,也就是说我的计数变量不能超过两个不同的数字并且这些可以去最多 4 个。我也尝试过使用 case_when,但收到一条错误消息,提示错误:案例 7 (!is.na(Code1) ~ 1) 必须是双向公式,而不是逻辑向量。

这是我尝试过的示例:

df$count = ifelse(is.na(df$Code2),1,2)

df$count = ifelse(is.na(Klara$Code3),2,3)

df$count = ifelse(is.na(Klara$Code4),3,4)

我也试过:

df <- df %>%
  mutate(count = case_when(!is.na(Code1) ~ 1, 
                                 !is.na(Code2) ~ 2, 
                                 !is.na(Code3) ~ 3,
                                 !is.na(Code4) ~ 4,
                                xor(Code1,Code2)))

所以,我无法弄清楚我做错了什么以及如何获得我需要工作的计数变量。有什么建议么?

提前谢谢了!!

【问题讨论】:

    标签: r if-statement case na


    【解决方案1】:

    使用rowSumsacrossdplyr方法:

    library(dplyr, warn = FALSE)
    
    dat <- dat |>
      mutate(count = rowSums(
        across(starts_with("Code"), ~ !is.na(.x))
      ))
    dat
    #>   ID Code1 Code2 Code3 Code4 count
    #> 1  1     5    NA    NA    NA     1
    #> 2  2     7     6     4    NA     3
    #> 3  3     5    12    NA    NA     2
    

    或者使用基础 R:

    dat$count <- rowSums(
      !is.na(dat[grep("^Code", names(dat), value = TRUE)])
    )
    dat
    #>   ID Code1 Code2 Code3 Code4 count
    #> 1  1     5    NA    NA    NA     1
    #> 2  2     7     6     4    NA     3
    #> 3  3     5    12    NA    NA     2
    

    数据

    dat <- structure(list(ID = c(1, 2, 3), Code1 = c(5L, 7L, 5L), Code2 = c(
      NA,
      6L, 12L
    ), Code3 = c(NA, 4L, NA), Code4 = c(NA, NA, NA)), class = "data.frame", row.names = c(
      NA,
      -3L
    ))
    

    【讨论】:

      【解决方案2】:

      我想你正在寻找这样的东西:

      a = c(5,      NA,    NA,    NA)
      b = c(7,       6,     4,    NA)
      c = c(5,      12,    NA,    NA)
      
      df <- cbind(a,b,c) %>% t() %>% data.frame() %>% setNames(c('code1', 'code2', 'code3', 'code4'))
      
      df$count <- rowSums(!is.na(df))
      
        code1 code2 code3 code4 count
      a     5    NA    NA    NA     1
      b     7     6     4    NA     3
      c     5    12    NA    NA     2
      

      编辑 base-r 解决方案

      df$count <- apply(df, 1, (x) sum(is.na(x)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 2020-12-30
        • 2017-12-23
        相关资源
        最近更新 更多