我正在合并一堆,csv
每个 id/pk/seqn 有 1 行。
> full = merge(demo, lab13am, by="seqn", all=TRUE)
> full = merge(full, cdq, by="seqn", all=TRUE)
> full = merge(full, mcq, by="seqn", all=TRUE)
> full = merge(full, cfq, by="seqn", all=TRUE)
> full = merge(full, diq, by="seqn", all=TRUE)
> print(length(full$ridageyr))
[1] 9965
> print(summary(full$ridageyr))
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 11.00 19.00 29.73 48.00 85.00
一切都很好。但是,我有另一个文件,每个 id 有多个行,例如:
"seqn","rxd030","rxd240b","nhcode","rxq250"
56,2,"","",NA,NA,""
57,1,"ACETAMINOPHEN","01200",2
57,1,"BUDESONIDE","08800",1
58,1,"99999","",NA
57
有两行。所以,如果我天真地尝试合并这个文件,我会有更多的行,我的数据就会全部歪斜。
> full = merge(full, rxq, by="seqn", all=TRUE)
> print(length(full$ridageyr))
[1] 15643
> print(summary(full$ridageyr))
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 14.00 41.00 40.28 66.00 85.00
有没有一种正常的惯用方式来处理这样的数据?例如,假设我想创建一个列,full
其中包含参与者在过去 30 天内是否接受了 RX。我可以通过以下方式获取键列表:
has_taken <- unique(rxq[rxq$rxd030 == "1",]$seqn)
hasnt_tak <- unique(rxq[rxq$rxd030 == "2",]$seqn)
full$takenRX <- ifelse(full$seqn %in% has_taken, TRUE, ifelse(full$seqn %in% hasnt_tak, FALSE, NA))
现在我有一takenRX
列我认为正确地为我的full
数据框中的每一行给出了 TRUE/FALSE/NA。我是否需要为每一位数据手动执行类似的操作,或者是否有更自动化的方式可以将每个键的多行数据带入我的数据框中?有没有更优雅的建议?更惯用的方法?
对于其他列,我想我想组合这些行以便有〜元组。
key, a, b, c
2, 0, 0, 0
加
key, baz
2, foo
2, bar
给了我类似的东西:
key, a, b, c, baz
2, 0, 0, 0, [foo, bar]
但是,我不确定要使用什么数据结构,[foo, bar]
所以我可以在以后轻松地使用“has foo in baz”作为逻辑。
在家玩,这里有/有一些代码