【问题标题】:Create dummy based on character vectors in r根据 r 中的字符向量创建虚拟对象
【发布时间】:2019-11-21 17:06:53
【问题描述】:

如果所有条目(在 cols value_1_value_3 中)都等于给定字符(例如“C”)或者是 NA,我想创建一个虚拟变量。

玩具示例:

df <- data.frame(state=rep("state"),
               candidate=c("a","b","c"),
               value_1= c("A","B","C"),
               value_2= c("A","B",NA),
               value_3= c("C",NA,NA), stringsAsFactors = FALSE)

需求:

df <- data.frame(state=rep("state"),
             candidate=c("a","b","c"),
             value_1= c("A","B","C"),
             value_2= c("A","B",NA),
             value_3= c("C",NA,NA), 
             dummy=c(0,0,1),stringsAsFactors = FALSE)

我试过了(但没用):

df$dummy <- ifelse(df[-(1:2)] %in% c("C","NA"),1,0)

【问题讨论】:

  • rowSums(df[-(1:2)] == "C" | is.na(df[-(1:2)])) == NCOL(df) - 2

标签: r dataframe if-statement character-encoding dummy-variable


【解决方案1】:

另一种方式:

rowSums(df[-(1:2)] != "C", na.rm=TRUE) == 0
# [1] FALSE FALSE  TRUE

它是如何工作的:

  • 对非“C”值进行检查矩阵
  • 按行计算非“C”值,跳过 NAs
  • 如果计数为 0,则为 TRUE;否则,假

令人困惑的是,df[-(1:2)] == "C" 会生成一个矩阵,而df[-(1:2)] %in% "C" 不会。要处理后者,请先包装as.matrix(df[-(1:2)])

【讨论】:

    【解决方案2】:

    我们可以逐行使用apply 并检查all 所选列中的条目是否等于"C",忽略NA 值。

    cols <- grep("^value", names(df))
    df$dummy <- as.integer(apply(df[cols] == "C", 1, all, na.rm = TRUE))
    
    df
    #  state candidate value_1 value_2 value_3 dummy
    #1 state         a       A       A       C     0
    #2 state         b       B       B    <NA>     0
    #3 state         c       C    <NA>    <NA>     1
    

    就您的尝试而言,%in% 不适用于整个数据框,您需要使用sapply/lapply 来检查多列中的值。事实上你可以在这里避免ifelse

    df$dummy <- as.integer(sapply(df[-c(1:2)], function(x) all(x %in% c(NA, "C"))))
    

    【讨论】:

      【解决方案3】:

      使用tidyverse的选项

      library(tidyverse)
      df %>% 
         mutate(dummy = pmap_int(select(., value_1, value_3),
              ~ +(!sum(c(...) != "C", na.rm = TRUE))))
      #    state candidate value_1 value_2 value_3 dummy
      #1 state         a       A       A       C     0  
      #2 state         b       B       B    <NA>     0
      #3 state         c       C    <NA>    <NA>     1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-23
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多