计算数据框R

时间:2018-03-01 18:43:39

标签: r dataframe

这是对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 中执行此操作的最佳方法是什么?

2 个答案:

答案 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")