代码之家  ›  专栏  ›  技术社区  ›  RROBINSON

R-添加表列以反映另一个表中某个值的存在

r
  •  1
  • RROBINSON  · 技术社区  · 6 年前

    我从Excel迁移到处理数据的能力超过了Excel的可复制性。转换进行得很顺利,但我遇到了一个障碍,因为我有限的R技能(以及我的现场同事!)

    问题

    主题数据帧

    ID    Var1   Var2  
    1     0.4    0.3
    2     0.4    0.1
    3     0.2    0.2
    4     0.3    0.7
    

    类型列表数据帧

    ID  Type
    1    A
    1    B
    1    C
    2    C
    3    B
    3    A
    4    C
    

    我想做的是从TypeList数据框中添加一个TypeA,TypeB,TypeC列到主题数据框中,如下所示:

    ID    Var1   Var2     TypeA   TypeB   TypeC
        1     0.4    0.3   TRUE   TRUE    TRUE
        2     0.4    0.1   FALSE  FALSE   TRUE
        3     0.2    0.2   TRUE   TRUE    FALSE
        4     0.3    0.7   FALSE  FALSE   TRUE
    

    这是一个简化的例子,实际的主题数据框有大约2000个条目,类型列表有大约70k个条目,大约4000个类型。在这些类型中,目前感兴趣的是其中10种。

    如有任何建议,将不胜感激。

    2 回复  |  直到 6 年前
        1
  •  2
  •   arg0naut91    6 年前

    一种方法:

    library(tidyverse)
    
    df2 <- df2 %>% mutate(spread_var = TRUE, Type = paste0("Type", Type)) %>% 
                   spread(Type, spread_var) %>% replace(., is.na(.), FALSE)
    
    df1 <- left_join(df1, df2)
    
    df1
    
      ID Var1 Var2 TypeA TypeB TypeC
    1  1  0.4  0.3  TRUE  TRUE  TRUE
    2  2  0.4  0.1 FALSE FALSE  TRUE
    3  3  0.2  0.2  TRUE  TRUE FALSE
    4  4  0.3  0.7 FALSE FALSE  TRUE
    
        2
  •  2
  •   akrun    6 年前

    这里有一个选项 data.table . dcast

    library(data.table)
    setDT(Subject)[dcast(setDT(TypeList), ID ~ paste0("Type", Type), 
               function(x) as.logical(length(x))), on = .(ID)]
    #   ID Var1 Var2 TypeA TypeB TypeC
    #1:  1  0.4  0.3  TRUE  TRUE  TRUE
    #2:  2  0.4  0.1 FALSE FALSE  TRUE
    #3:  3  0.2  0.2  TRUE  TRUE FALSE
    #4:  4  0.3  0.7 FALSE FALSE  TRUE
    

    或使用 merge base R

    merge(`row.names<-`(Subject, Subject$ID), table(TypeList) > 0, by = "row.names")[-1]
    #  ID Var1 Var2     A     B     C
    #1  1  0.4  0.3  TRUE  TRUE  TRUE
    #2  2  0.4  0.1 FALSE FALSE  TRUE
    #3  3  0.2  0.2  TRUE  TRUE FALSE
    #4  4  0.3  0.7 FALSE FALSE  TRUE