我有以下数据框:
# A tibble: 13 x 2
val Tracking
<dbl> <int>
1 36 1
2 36 2
3 36 3
4 36 4
5 18 5
6 18 6
7 1 1
8 7 2
9 7 3
10 7 4
11 7 5
12 7 6
13 20 1
“跟踪”列表示该值出现在第二个数据帧的哪一行。因此,例如,值36出现在第二数据帧的行1,2,3,4中。
现在,我想构建一个函数,它返回出现在同一行中的值,以及多少次。例如,值36和7都出现在2,3,4行中,所以我的输出应该是(36,7,c(2,3,4))。
我已经构建了表格
T_d <- table(df_d$val, df_d$Tracking)
1 2 3 4 5 6
1 1 0 0 0 0 0
7 0 1 1 1 1 1
18 0 0 0 0 1 1
20 1 0 0 0 0 0
36 1 1 1 1 0 0
但它仍然不是我需要的。
我需要一个高性能的解决方案,适用于非常大的数据帧,如果可能的话,还需要dplyr而不是data.table(我不会说data.table .... :)
答案 0 :(得分:2)
这可以使用两个连续的aggregate
函数来解决:
agg <- aggregate(val ~ Tracking, data = df, c)
agg$val <- paste(agg$val) # Change list output to character
aggregate(Tracking ~ val, data = agg, c)
中级输出:
agg
Tracking val
1 1 36, 1, 20
2 2 36, 7
3 3 36, 7
4 4 36, 7
5 5 18, 7
6 6 18, 7
最终输出:
val Tracking
1 c("18", "7") 5, 6
2 c("36", "1", "20") 1
3 c("36", "7") 2, 3, 4
示例数据:
df <- data.frame(val= c(36,36,36,36,18,18,1,7,7,7,7,7,20),
Tracking=c(1,2,3,4,5,6,1,2,3,4,5,6,1))
答案 1 :(得分:1)
希望这有帮助!
library(dplyr)
df %>%
group_by(Tracking) %>%
summarise(val_combined = paste(val, collapse=",")) %>%
group_by(val_combined) %>%
summarise(Tracking_combined = paste(Tracking, collapse=","))
输出为:
val_combined Tracking_combined
1 18,7 5,6
2 36,1,20 1
3 36,7 2,3,4
示例数据:
df <- structure(list(val = c(36L, 36L, 36L, 36L, 18L, 18L, 1L, 7L,
7L, 7L, 7L, 7L, 20L), Tracking = c(1L, 2L, 3L, 4L, 5L, 6L, 1L,
2L, 3L, 4L, 5L, 6L, 1L)), .Names = c("val", "Tracking"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"
))
答案 2 :(得分:0)
假设您有一个名为Table1和Table2的表。并且它们具有类似于表1的外键实现,并且主键是Table2的主键(PKID)的Foriegn键。 这是查询
SELECT PKID FROM TABLE2具有COUNT(PKID)&gt; 1 GROUP BY PKID;