【发布时间】:2019-02-01 11:43:06
【问题描述】:
在 data.table 中执行联接后,我想保留列(数据框中的“人”)。我能够得到接近所需输出的东西,但由于我对 data.table 的经验有限,它需要在 data.table 和 dplyr 之间切换:
这里是数据框:
df<-structure(list(person = c("p1", "p1", "p1", "p1", "p1", "p1",
"p1", "p2", "p2", "p2", "p3", "p3", "p3", "p4", "p4", "p4", "p5",
"p5", "p5", "p6", "p6", "p6", "p7", "p7", "p7"), hp_char = c("hp1",
"hp2", "hp3", "hp4", "hp5", "hp6", "hp7", "hp8", "hp9", "hp10",
"hp1", "hp2", "hp3", "hp5", "hp6", "hp7", "hp8", "hp9", "hp10",
"hp3", "hp4", "hp5", "hp1", "hp2", "hp3")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -25L), .Names = c("person",
"hp_char"), spec = structure(list(cols = structure(list(person = structure(list(), class = c("collector_character",
"collector")), hp_char = structure(list(), class = c("collector_character",
"collector"))), .Names = c("person", "hp_char")), default = structure(list(), class = c("collector_guess",
"collector"))), .Names = c("cols", "default"), class = "col_spec"))
我正在做一个自连接来获取任意两个“hp_id”同时出现的实例数,如下所示(类似于this question 中的详细说明)。我将“人”保留在by=.(...) 中,以查看谁参与了共现组合(例如 hp1 和 hp2 在个人 p1、p3 和 p7 中同时出现):
df_by2<- setDT(df)[df, on = "person", allow = TRUE][
hp_char < i.hp_char, .N, by = .(person ,HP_ID1 = hp_char, HP_ID2 = i.hp_char)]
但由于by =.(person,... 中包含“person”,因此计数(= N)根据“person”、“hp_id”和“hp_id2”的组合进行分隔。所以我切换到 dplyr 以接近我想要的如下。
dfx<- df_by2 %>% group_by(HP_ID1,HP_ID2) %>% mutate (counts=length(person)) %>% spread(person,person) %>% select (-N) %>% unique() %>% filter(counts>1) %>% unite(person,p1:p7, sep="") %>% mutate (involved_id=gsub('?NA', ' ', person)) %>% select (-person)
这是我得到的输出:
# A tibble: 12 x 4
HP_ID1 HP_ID2 counts involved_id
<chr> <chr> <int> <chr>
1 hp1 hp2 3 p1 p3 p7
2 hp1 hp3 3 p1 p3 p7
3 hp10 hp8 2 p2 p5
4 hp10 hp9 2 p2 p5
5 hp2 hp3 3 p1 p3 p7
6 hp3 hp4 2 p1 p6
7 hp3 hp5 2 p1 p6
8 hp4 hp5 2 p1 p6
9 hp5 hp6 2 p1 p4
10 hp5 hp7 2 p1 p4
11 hp6 hp7 2 p1 p4
12 hp8 hp9 2 p2 p5
这很接近,但所需的输出(格式正确但不整洁的“involved_id”列)是:
# A tibble: 12 x 4
HP_ID1 HP_ID2 counts involved_id
<chr> <chr> <int> <chr>
1 hp1 hp2 3 p1, p3, p7
2 hp1 hp3 3 p1, p3, p7
3 hp10 hp8 2 p2, p5
4 hp10 hp9 2 p2, p5
5 hp2 hp3 3 p1, p3, p7
6 hp3 hp4 2 p1, p6
7 hp3 hp5 2 p1, p6
8 hp4 hp5 2 p1, p6
9 hp5 hp6 2 p1, p4
10 hp5 hp7 2 p1, p4
11 hp6 hp7 2 p1, p4
12 hp8 hp9 2 p2, p5
所有这些都非常麻烦,我想知道是否有更简单的方法。我最近刚刚遇到 data.table 并喜欢学习它。非常感谢使用 data.table 的任何帮助。
【问题讨论】:
-
在
"hp10" < "hp9" == TRUE的情况下,您比较hp_char < i.hp_char是否按预期工作? -
嗨。请提出独立的问题,包括链接中您需要的任何内容,并附上信用。尤其是不要让我们去问第三个问题。
-
@SymbolixAU 对不起,我错过了你的意思。你能澄清一下吗?就输出而言,我看起来很好,有/没有从 .by(..) 中删除“人”。
-
“hp10”是否小于或大于“hp9”?
-
@SymbolixAU 这些是离散字符。如果我正确地理解了你,那么任何 hp_chars' 之间都没有关系。
标签: r dataframe join data.table