这是对this question的扩展,但我无法找到答案,所以我要求新鲜的。
我有一个数据框,其中一小部分内容如下所示:
X 73600000 73680000 B 43.6938
X 77160000 77290000 E1 38.7108
X 80450000 80630000 D 37.2528
X 8720000 8790000 E2 39.9114
X 99940000 100025000 B 41.2118
1 10000000 10100000 E2 46.975
1 100030000 100130000 E1 37.717
1 101080000 101330000 C 38.064
1 101390000 101755000 E2 37.9268
2 100430000 100870000 E2 41.8766
2 100870000 101000000 C 42.1769
2 101220000 101620000 E3 45.216
2 101345000 101440000 A 44.5705
2 101620000 101830000 E3 44.3948
3 100180000 100315000 E2 40.5067
3 100610000 100920000 E2 37.9716
3 101525000 101945000 E2 38.7479
3 101710000 101950000 C 38.2996
3 101945000 102260000 C 36.2844
3 10380000 10790000 D 49.1885
3 104320000 105090000 C 35.4865
3 106990000 107160000 C 38.3465
我想为$4
中的每个值类计算$1
列中字符的成对出现次数。
因此,对于此示例,我的输出应如下所示:
X BE1 1
X DE1 1
X DE2 1
X BE2 1
1 E1E2 1
1 CE1 1
1 CE2 2
2 E2E2 1
2 CE3 1
2 AE3 2
3 E2E2 2
3 CE2 1
3 CC 2
3 CD 2
我也想计算重叠,从答案中可以看出。
例如,$4
中的值3将从第一行产生以下组合:
E2E2,E2E2,E2C,CC,CD,DC,CC
出于我的目的,CD和DC是相同的,所以我将它们添加到CD 2中。
在 R 中执行此操作的最佳方法是什么?
答案 0 :(得分:1)
我不确定它是"最好的",但是
do.call(rbind,
imap(split(exd[[4]], exd[[1]]),
function(x, name) {
n <- length(x)
data.frame(V1 = name,
table(apply(cbind(x[1:(n-1)], x[2:n]),
1,
function(x) paste(sort(x), collapse = ""))))
}))
## V1 Var1 Freq
## 1.1 1 CE1 1
## 1.2 1 CE2 1
## 1.3 1 E1E2 1
## 2.1 2 AE3 2
## 2.2 2 CE2 1
## 2.3 2 CE3 1
## 3.1 3 CC 2
## 3.2 3 CD 2
## 3.3 3 CE2 1
## 3.4 3 E2E2 2
## X.1 X BE1 1
## X.2 X BE2 1
## X.3 X DE1 1
## X.4 X DE2 1
会奏效。
如果您想要所有成对组合,您可以执行类似
的操作do.call(rbind,
imap(split(exd[[4]], exd[[1]]),
function(x, name) {
data.frame(V1 = name,
table(apply(combn(as.character(x), 2),
2,
paste, collapse = "")))
}))
## V1 Var1 Freq
## 1.1 1 CE2 1
## 1.2 1 E1C 1
## 1.3 1 E1E2 1
## 1.4 1 E2C 1
## 1.5 1 E2E1 1
## 1.6 1 E2E2 1
## 2.1 2 AE3 1
## 2.2 2 CA 1
## 2.3 2 CE3 2
## 2.4 2 E2A 1
## 2.5 2 E2C 1
## 2.6 2 E2E3 2
## 2.7 2 E3A 1
## 2.8 2 E3E3 1
## 3.1 3 CC 6
## 3.2 3 CD 2
## 3.3 3 DC 2
## 3.4 3 E2C 12
## 3.5 3 E2D 3
## 3.6 3 E2E2 3
## X.1 X BB 1
## X.2 X BD 1
## X.3 X BE1 1
## X.4 X BE2 1
## X.5 X DB 1
## X.6 X DE2 1
## X.7 X E1B 1
## X.8 X E1D 1
## X.9 X E1E2 1
## X.10 X E2B 1
答案 1 :(得分:1)
这是一个data.table方法。您可以滞后V4向量,对滞后和原始V4进行排序和粘贴,以确保每对之间的顺序无关紧要(例如CD和DC相同),然后将每个配对事件的计数制成表格。
dat[, .(Pairs=mapply(function(x,y) paste(sort(c(x,y)), collapse=""),
shift(V4), V4)[-1]), by=V1][,
.N, by=.(V1, Pairs)]
# V1 Pairs N
# 1: X BE1 1
# 2: X DE1 1
# 3: X DE2 1
# 4: X BE2 1
# 5: 1 E1E2 1
# 6: 1 CE1 1
# 7: 1 CE2 1
# 8: 2 CE2 1
# 9: 2 CE3 1
# 10: 2 AE3 2
# 11: 3 E2E2 2
# 12: 3 CE2 1
# 13: 3 CC 2
# 14: 3 CD 2
数据:
library(data.table)
dat <- fread("
X 73600000 73680000 B 43.6938
X 77160000 77290000 E1 38.7108
X 80450000 80630000 D 37.2528
X 8720000 8790000 E2 39.9114
X 99940000 100025000 B 41.2118
1 10000000 10100000 E2 46.975
1 100030000 100130000 E1 37.717
1 101080000 101330000 C 38.064
1 101390000 101755000 E2 37.9268
2 100430000 100870000 E2 41.8766
2 100870000 101000000 C 42.1769
2 101220000 101620000 E3 45.216
2 101345000 101440000 A 44.5705
2 101620000 101830000 E3 44.3948
3 100180000 100315000 E2 40.5067
3 100610000 100920000 E2 37.9716
3 101525000 101945000 E2 38.7479
3 101710000 101950000 C 38.2996
3 101945000 102260000 C 36.2844
3 10380000 10790000 D 49.1885
3 104320000 105090000 C 35.4865
3 106990000 107160000 C 38.3465")