我正在将一项任务从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种。
任何建议将不胜感激。
答案 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