【问题标题】:Ifelse conditional on same strings in multiple columnsIfelse 以多列中的相同字符串为条件
【发布时间】:2021-01-19 20:42:28
【问题描述】:

所以我想这可以通过使用 mutate() 和 ifelse() 编写一个非常长的行代码来实现,但我想知道是否有一种方法可以在不编写代码的情况下做到这一点。

我有数据,其中每个人的程度以无序的方式写入。数据如下所示:

id <- c(1, 2, 3, 4, 5, 6)
degree1 <- c("masters", "bachelors", "PhD", "bachelors", "bachelors", NA)
degree2 <- c("PhD", "masters", "bachelors", NA, NA, NA)
degree3 <- c("bachelors", NA, "masters", NA, "masters", NA)

现在我想创建一个包含最高学位字符串的新列,像这样

dat$highest_degree <- c("PhD", "masters", "PhD", "bachelors", "masters", NA)

我怎样才能做到这一点?

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    一个选项是循环选择“度”列的行,转换为factor,并按顺序指定levels,删除级别以删除未使用的级别并选择first level

    v1 <- c("PhD", "masters", "bachelors")
    dat$highest_degree <- apply(dat[-1], 1, function(x)  
            levels(droplevels(factor(x, levels = v1)))[1])
    dat$highest_degree
    #[1] "PhD"       "masters"   "PhD"       "bachelors" "masters"   NA  
    

    或者使用tidyverse,重塑成'long'格式,然后slicearrangeing 长格式列之后的第一行matching 使用有序度向量并按'id'分组,然后加入原始数据

    library(dplyr)
    library(tidyr)
    dat %>% 
         pivot_longer(cols = starts_with('degree'), values_to = 'highest_degree') %>%
         select(-name) %>% 
         arrange(id, match(highest_degree, v1)) %>% 
         group_by(id) %>%
         slice_head(n = 1) %>%
         ungroup %>% 
         left_join(dat, .)
    

    数据

    dat <- data.frame(id, degree1, degree2, degree3)
    

    【讨论】:

      【解决方案2】:

      这是使用pmin + factor 的基本 R 选项

      lvs <- c("PhD", "masters", "bachelors")
      dat$highest_degree <- lvs[
        do.call(
          pmin,
          c(asplit(matrix(as.integer(factor(as.matrix(dat[-1]), levels = lvs)), nrow(dat)), 2),
            na.rm = TRUE
          )
        )
      ]
      

      给了

      > dat
        id   degree1   degree2   degree3 highest_degree
      1  1   masters       PhD bachelors            PhD
      2  2 bachelors   masters      <NA>        masters
      3  3       PhD bachelors   masters            PhD
      4  4 bachelors      <NA>      <NA>      bachelors
      5  5 bachelors      <NA>   masters        masters
      6  6      <NA>      <NA>      <NA>           <NA>
      

      数据

      > dput(dat)
      structure(list(id = c(1, 2, 3, 4, 5, 6), degree1 = c("masters",
      "bachelors", "PhD", "bachelors", "bachelors", NA), degree2 = c("PhD",
      "masters", "bachelors", NA, NA, NA), degree3 = c("bachelors",
      NA, "masters", NA, "masters", NA)), class = "data.frame", row.names = c(NA,
      -6L))
      

      【讨论】:

        猜你喜欢
        • 2021-05-27
        • 1970-01-01
        • 2018-06-20
        • 2013-12-16
        • 2016-09-09
        • 2020-03-28
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多