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

时间:2018-11-04 21:25:42

标签: r

我正在将一项任务从Excel移至R,以实现可重现性,并能够处理记录数量超过Excel限制的数据文件。转换进展顺利,但是由于我的R技能(以及我的现场同事的技能)有限,因此遇到了障碍。

问题

主题数据框

BigInteger

TypeList数据框

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

我想做的是像这样从TypeList数据帧向主题数据帧添加一个TypeA,TypeB,TypeC列:

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

这是一个简化的示例,实际的Subject数据帧有2000个条目,TypeList约有4000种类型的70k条目。在这些类型中,目前感兴趣的是其中的10种。

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

这里是data.table的一个选项。 dcast将“ TypeList”数据集转换为“宽”格式,并在“ ID”列上与“主题”连接

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

答案 1 :(得分:2)

一种解决方法:

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