【发布时间】:2019-01-22 21:45:37
【问题描述】:
假设我有以下数据库df。
df <- data.frame(ID= c("A", "B", "C"),
Var1 = c(234, 12, 345),
Var2 = c(4, 555, 325),
Var3 = c("45|221|2", "982", NA))
> df
ID Var1 Var2 Var3
1 A 234 4 45|221|2
2 B 12 555 982
3 C 345 325 <NA>
我想创建一个data.frame,其中Var1 和Var2 通过ID 与Var3 中的元素组合。
我正在寻找的结果应该如下所示:
> outcome
ID VarA VarB
1 A 234 45
2 A 234 221
3 A 234 2
4 A 4 45
5 A 4 221
6 A 4 2
7 B 12 982
8 B 555 982
注意:
-
Var3中的元素用竖线分隔| -
ID == C不在outcome中,因为对于ID,Var3是NA。
原始数据由数百万个 ID 组成。
【问题讨论】:
-
@markus 确实,有很多关于从宽到长移动以及如何拆分字符串的条目。我想这里的棘手部分是按 ID 正确堆叠 Var1-Var3 和 Var2-Var3,并有效地做到这一点。
-
library(tidyverse); df %>% filter(ID != "C") %>% separate_rows(Var3, sep = "\\|") %>% gather(key, Var2, -ID, -Var3) %>% select(-key) %>% arrange(ID)呢? -
@markus 在发布刷新页面之前,我没有看到您写过类似的答案。如果你想发布你的,我会删除我的,因为我认为
separate_rows是解决这个问题的更合乎逻辑的函数,即使str_split和unnest具有相同的结果。 -
@Mako212 别担心。编辑您的答案,如果您愿意,可以添加
separate_rows。