【问题标题】:Is there a function in R to change several similar factor levels at once?R中是否有一个函数可以一次改变几个相似的因子水平?
【发布时间】:2020-10-20 09:00:41
【问题描述】:

我的第二个问题是堆栈溢出,所以欢迎所有提示:)

对于临床研究,我必须重新编码许多二分法基线特征,其中包含“是”和“否”的几种变体。

目前我正在对这些变量一一重新编码,但它需要很多行代码,并且所有不同变量之间的变化非常相似。如果未知或不适用,我想重新编码为 0。

例子

library(dplyr)

A <- c("Yes", "y", "no", "n", "UK")
B <- c("yes", "Yes", "y", "no", "no")
C <- c("Y", "y", "n", "no", "uk")

#attempt 1 was to recode all variables one by one

A <- recode(A,  "Yes" = "yes", "y" = "yes", "n" = "no", "UK" = "no")
B <- recode (B, "Yes" = "yes", "y" = "yes")
C <- recode(C, "Y" = "yes", "y" = "yes", "n" = "no", "uk" = "no")

#attempt 2 was to use a list option on all vectors.

levels(A) <- list("yes"=c("Likely", "y", "Y", "Yes", "yes"), "no" = c("", "No", "UK", "no", "N", "n"))

我想知道是否有一种方法可以在包含所有 A、B、C 的列表/向量上执行此列表选项?或者也许还有另一种方法可以让我更轻松、更高效地重新编码这些变量?

任何帮助都会很棒:)

【问题讨论】:

    标签: r levels recode


    【解决方案1】:

    如果向量的长度相同,您可以将它们放在数据框中,或者如果它们的长度不同,请将它们放在一个列表中,然后使用 lapply 为所有向量应用相同的函数。您可以使用forcats::fct_collapse 将多个级别合并为一个。

    list_vec <- list(A, B, C)
    
    list_vec <- lapply(list_vec, function(x) forcats::fct_collapse(x, 
                "yes"=c("Likely", "y", "Y", "Yes", "yes"), 
                "no" = c("", "No", "UK", "no", "N", "n", "uk")))
    

    【讨论】:

    • 这很完美!非常感谢!我有新手跟进问题:你到底是什么意思 fct_collapse 函数将多个级别折叠为一个?有两个层次吧? (“是”和“否”)对吗?
    • 是的,但是在您的向量中有多个值可以具有“是”值,例如“可能”、“y”、“Y”、“是”、“是”。这就是为什么我说将多个级别合并为一个。
    【解决方案2】:

    您可以使用grepl 从向量中选择yesno

    c("0","no","yes")[1 + grepl("^no?", A, TRUE) + 2*grepl("^ye?s?", A, TRUE)]
    #[1] "yes" "yes" "no"  "no"  "0"  
    

    要对许多向量进行此操作,您可以使用如下循环:

    for(x in c("A","B","C")) {
      assign(x, c("0","no","yes")[1 + grepl("^no?", get(x), TRUE) +
                                  2*grepl("^ye?s?", get(x), TRUE)])
    }
    A
    #[1] "yes" "yes" "no"  "no"  "0"  
    B
    #[1] "yes" "yes" "yes" "no"  "no" 
    C
    #[1] "yes" "yes" "no"  "no"  "0"  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2020-08-20
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多