【发布时间】:2022-01-16 02:58:21
【问题描述】:
我正在尝试为以下问题找到解决方案但无法做到,请帮助我解决逻辑,我也可以指导,我可以编码但无法提出必要的逻辑。
问题来了:
我有一个这样的数据集:
df <- data.frame(x = c(1, 1, 2, 2, 2, 2, 3, 4, 5, 1, 2,3, 4, 7, 8, 9, 4, 10, 10, 11, 12), y = c('a', 'b', 'c','d', 'e', 'f', 'a', 'a', 'e', 'k', 'l', 'm', 'n', 'b', 'e', 'e', 'b', 'x', 'y', 'z', 'z' ))
预期的输出应该是:
col1 col2
1 1,4,3, 7
2 2,5,8,9
10 10
11 11, 12
逻辑:将 x 列视为键,将 y 视为值,现在如果一个键与不同的 value(y) 值重复,那么所有这些键都是连接的,作为 例子:1 与 a 和 b、k 相连,但 a 也与 4,3、7 相连。现在 2 与 cde 和 f 相连,所以 2、5、8、9 也与 z 与 11 相连和 12. 为了建立最终连接,我们可以将它们连接在一起,并取出第一个键作为键,其余为逗号分隔值。
我的尝试
library(data.table)
setDT(df)
setnames(df, c('x', 'y'),c('los', 'mob'))
dfLos <- df[, .(mobconcat = paste0(mob, collapse = ',')), .(los)]
dfMob <- df[, .(losconcat = paste0(los, collapse = ',')), .(mob)]
df <- merge(df, dfMob, by='mob', all.x=TRUE)
dim(df)
df <- merge(df, dfLos, by='los', all.x=TRUE)
(showing only few rows)
los mob losconcat mobconcat
1: 1 a 1,3,4 a,b,k
2: 1 b 1,7,4 a,b,k
3: 1 k 1 a,b,k
4: 2 c 2 c,d,e,f,l
5: 2 d 2 c,d,e,f,l
6: 2 e 2,5,8,9 c,d,e,f,l
7: 2 f 2 c,d,e,f,l
8: 2 l 2 c,d,e,f,l
现在我被困在这里,可能是这种方法是浪费,我在这里尝试使用逗号分隔所有键的方法来获取所有键,但无法理解如何进一步。
非常感谢。欢迎您提出任何其他方法或扩展我的方法,我对任何人都很好。
【问题讨论】:
标签: r dataframe data.table