【问题标题】:Classifying column in data.frame based on vectors基于向量对data.frame中的列进行分类
【发布时间】:2019-06-02 05:35:37
【问题描述】:

在以下 data.frame df 中,我想创建一个新列,其值将从A 列的分类中派生。如果A 列中的数字对应于G1 向量中的数字之一,则在名为Group 的新列中应将其分类为“G1”。同样,如果A 列中的值对应于G2 向量中的值之一,则应将其归类为“G2”。其余列应归类为“G0”。

A <- seq(1900,2000,1)
B <- rnorm(101,10,2)
df <- data.frame(A=A,B=B)

G1 <- c(1963,1982,1952)
G2 <- c(1920,1933,1995)

# This doesn't do what I would like it to achieve
df$group <- ifelse(df$A == G1,"G1",ifelse(df$A == G2,"G2","G0"))

【问题讨论】:

    标签: r dataframe vector classification


    【解决方案1】:

    这是一个有趣而简洁的替代方案:

    df$group <- c("G0", "G1", "G2")[1 + 1 * df$A %in% G1 + 2 * df$A %in% G2]
    

    我们有一个包含三个选项c("G0", "G1", "G2") 的向量。从元素角度考虑,如果df$A %in% G1df$A %in% G2 都不为真,我们选择“G0”(因为开头有1 + ...)。由于G1G2 不重叠,因此仅当df$A %in% G1 时才会选择“G1”。类似地,索引为 3 并且仅当 df$A %in% G2 时才选择“G2”。

    【讨论】:

      【解决方案2】:

      你在看什么

      df$group <- ifelse(df$A %in% G1, "G1", ifelse(df$A %in% G2, "G2", "G0"))
      

      这可以用dplyr中的case_when更好地表示

      library(dplyr)
      df %>%
         mutate(group = case_when(A %in% G1 ~ "G1", 
                                  A %in% G2 ~ "G2", 
                                  TRUE ~ "G0"))
      

      【讨论】:

        【解决方案3】:

        问题是您不想测试列中的值是否等于 A 或B;这些是向量,该测试没有意义。相反,您想知道值 是 A 还是 B 的元素。将代码调整为

        df$group <- ifelse(df$A %in% G1,"G1",ifelse(df$A %in% G2,"G2","G0"))
        

        当我检查它时,这有效。可能有更优雅的解决方案,但这与您的第一次尝试密切相关。

        【讨论】:

        • 非常感谢,这也是另一个人的建议,而且效果很好。
        猜你喜欢
        • 1970-01-01
        • 2015-04-25
        • 2014-06-07
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        相关资源
        最近更新 更多