计算R中的一个组中两个值同时出现的次数

JRF1111

我搜索了这个问题的答案,并发现了类似的那些(计算每个组中的行数在R计数变量值的唯一组合数据框列元素的[R计数出现的群体),但他们没有解决我特别的问题。

我有一个变量数据帧yearIDcode每个人在(可能)多个过程中都有ID和可以具有多个codeyears

df = data.frame(ID   = c(1,1,1,1, 2,2,2, 3, 4,4,4,4,4,4,4,4, 5,5,5),
                year = c(2018, 2018, 2020, 2020,
                         2020, 2020, 2020,
                         2011,
                         2019, 2019, 2019, 2019, 2020, 2020, 2020, 2020,
                         2018, 2019, 2020),
                code = c("A", "B", "C", "D",
                         "A", "B", "Q",
                         "G",
                         "A", "B", "Q", "G", "C", "D", "T", "S",
                         "S", "Z", "F")

df
   ID year code
1   1 2018    A
2   1 2018    B
3   1 2020    C
4   1 2020    D
5   2 2020    A
6   2 2020    B
7   2 2020    Q
8   3 2011    G
9   4 2019    A
10  4 2019    B
11  4 2019    Q
12  4 2019    G
13  4 2020    C
14  4 2020    D
15  4 2020    T
16  4 2020    S
17  5 2018    S
18  5 2019    Z
19  5 2020    F

我想是另一个数据帧给次的两个不同的值的数目code的分组内共发生IDyear(在这个例子中,A和B共发生3次,和A和C共发生0次),其然后,我将用于网络分析。

到目前为止,我有这种语法:

1:制作广泛的数据

library(tidyverse)
wide = df %>% 
        group_by(year, ID) %>% 
        mutate(row = row_number()) %>% 
        ungroup() %>% 
        pivot_wider(
            id_cols = c(ID, year),
            names_from = row, 
            names_prefix = "code_", 
            values_from = code
        )

2:制作节点列表

nodes = distinct(df, code) %>% rowid_to_column("id")

3:制作边列表

#edge list needs to be three vars: source, dest, and weight
# source and dest are simply code names that (potentially) co-occur in the same year for an ID
# weight is the number of times the codes co-occurred in the same year for each ID.

#all combinations of two codes
edges = combn(x = nodes$code, m = 2 ) %>% 
    t() %>% 
    as.data.frame()

colnames(edges) = c("source", "dest")
edges$weight = NA_integer_


#oh, no! a for() loop! a coder's last ditch effort to make something work
for(i in 1:nrow(edges)){
    
    source = edges$source[i]
    dest = edges$dest[i]
    

    #get the cases with the first code of interest
    temp = df %>% 
        filter( code == source ) %>% 
        select(ID, year)
    
    #get the other codes that occurred for that ID in that year
    temp = left_join(temp, 
                     wide, 
                     by = c("ID", "year"))
    
    
    #convert to a logical showing if the other codes are the one I want
    temp = temp %>% mutate_at(vars(starts_with("code_")),
                            function(x){ x == dest }
    ) 
    
    #sum the number of times `source` and `dest` co-occurred
    temp$dest = temp %>% select(starts_with("code_")) %>% rowSums(., na.rm=TRUE)
    edges$weight[i] = sum(temp$dest, na.rm = TRUE)
    
}

编辑以添加结果:

结果:

edges
   source dest weight
1       A    B      3
2       A    C      0
3       A    D      0
4       A    Q      2
5       A    G      1
6       A    T      0
7       A    S      0
8       A    Z      0
9       A    F      0
10      B    C      0
11      B    D      0
12      B    Q      2
13      B    G      1
14      B    T      0
15      B    S      0
16      B    Z      0
17      B    F      0
18      C    D      2
19      C    Q      0
20      C    G      0
21      C    T      1
22      C    S      1
23      C    Z      0
24      C    F      0
25      D    Q      0
26      D    G      0
27      D    T      1
28      D    S      1
29      D    Z      0
30      D    F      0
31      Q    G      1
32      Q    T      0
33      Q    S      0
34      Q    Z      0
35      Q    F      0
36      G    T      0
37      G    S      0
38      G    Z      0
39      G    F      0
40      T    S      1
41      T    Z      0
42      T    F      0
43      S    Z      0
44      S    F      0
45      Z    F      0

这就是我想要的(一个数据框显示A和B同时发生3次,A和C同时发生0次,A和D同时发生0次,A和G同时发生0次,A和Q同时发生-发生2次,依此类推...)。因此这可行,但即使是这个小示例,也需要一到两秒钟。我的真实数据集是大约3,000,000个观测值。我让它运行了一段时间,但停下来才发现它完成了〜1%。

有没有更好/更快的方法来做到这一点?

伪旋转

这是一个替代方案,它仅执行联接,因此对于大数据来说可能非常快。

library(data.table)
setDT(df)
df[df, on = c('ID','year'), allow.cartesian = TRUE][
  code<i.code, .N, .(pair = paste0(code, i.code))]

#>     pair N
#>  1:   AB 3
#>  2:   CD 2
#>  3:   AQ 2
#>  4:   BQ 2
#>  5:   GQ 1
#>  6:   AG 1
#>  7:   BG 1
#>  8:   CT 1
#>  9:   DT 1
#> 10:   ST 1
#> 11:   CS 1
#> 12:   DS 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何计算R中连续两个给定值同时出现的次数?

来自分类Dev

将两个列合并到一个DataFrame中,并使用PySpark计算出现次数

来自分类Dev

在R中如何计算一个值出现并满足多个条件的次数

来自分类Dev

如果两个值都在一个组中,如何在SSRS 2010中计算比率

来自分类Dev

计算单元格中两个值的组合出现的次数

来自分类Dev

获取两个不同列表中同一索引处一对值的出现次数

来自分类Dev

如何计算一个数据帧的两列中某个元素的出现次数?

来自分类Dev

在 Laravel 中同时从另外两个模型中获取一个值

来自分类Dev

我如何计算一个独特值出现在列中的次数?

来自分类Dev

如何计算一个值出现在MySQL列中的次数?

来自分类Dev

POSTGRESQL-计算另一个表中另一个值的出现次数,即使= 0

来自分类Dev

当两个键的值相同时,从python字典中删除一个项目

来自分类Dev

如何计算一个字符的出现次数,同时忽略谷歌表格中其他人出现的相同字符的其他出现次数?

来自分类Dev

Xquery:计算一组记录中每个记录中一个术语出现的次数

来自分类Dev

计算组中的唯一值,然后将其分为两个类别

来自分类Dev

根据给定值及其出现的次数在R中创建一个向量

来自分类Dev

在R中:创建一个新列,该列计算一个值在一个列中出现的次数,但从另一列中排除NA值

来自分类Dev

计算一个值在多维数组中出现的次数

来自分类Dev

计算一个值在表SQL中出现的次数

来自分类Dev

一个 EditText 中的两个输入值

来自分类Dev

如何计算Oracle中两个表之间的出现次数?

来自分类Dev

分组并计算存储在两个单独字段中的ObjectID的出现次数

来自分类Dev

SQL查询:计算两个表中“ id”的出现次数

来自分类Dev

Javascript代码来计算对象中两个不同变量的元素组合的出现次数

来自分类Dev

我可以在一个引文文件中同时添加两个R包引文(一个包,一个文章)吗?

来自分类Dev

根据Google Apps脚本中的条件,计算一个值在电子表格列中出现的次数

来自分类Dev

计算字符串的出现次数,并对大文件中的下一个逗号值求和

来自分类Dev

计算两个日期之间一周中的每一天的发生次数

来自分类Dev

Spark-在两个不同的列中查找每个不同值的总出现次数

Related 相关文章

  1. 1

    如何计算R中连续两个给定值同时出现的次数?

  2. 2

    将两个列合并到一个DataFrame中,并使用PySpark计算出现次数

  3. 3

    在R中如何计算一个值出现并满足多个条件的次数

  4. 4

    如果两个值都在一个组中,如何在SSRS 2010中计算比率

  5. 5

    计算单元格中两个值的组合出现的次数

  6. 6

    获取两个不同列表中同一索引处一对值的出现次数

  7. 7

    如何计算一个数据帧的两列中某个元素的出现次数?

  8. 8

    在 Laravel 中同时从另外两个模型中获取一个值

  9. 9

    我如何计算一个独特值出现在列中的次数?

  10. 10

    如何计算一个值出现在MySQL列中的次数?

  11. 11

    POSTGRESQL-计算另一个表中另一个值的出现次数,即使= 0

  12. 12

    当两个键的值相同时,从python字典中删除一个项目

  13. 13

    如何计算一个字符的出现次数,同时忽略谷歌表格中其他人出现的相同字符的其他出现次数?

  14. 14

    Xquery:计算一组记录中每个记录中一个术语出现的次数

  15. 15

    计算组中的唯一值,然后将其分为两个类别

  16. 16

    根据给定值及其出现的次数在R中创建一个向量

  17. 17

    在R中:创建一个新列,该列计算一个值在一个列中出现的次数,但从另一列中排除NA值

  18. 18

    计算一个值在多维数组中出现的次数

  19. 19

    计算一个值在表SQL中出现的次数

  20. 20

    一个 EditText 中的两个输入值

  21. 21

    如何计算Oracle中两个表之间的出现次数?

  22. 22

    分组并计算存储在两个单独字段中的ObjectID的出现次数

  23. 23

    SQL查询:计算两个表中“ id”的出现次数

  24. 24

    Javascript代码来计算对象中两个不同变量的元素组合的出现次数

  25. 25

    我可以在一个引文文件中同时添加两个R包引文(一个包,一个文章)吗?

  26. 26

    根据Google Apps脚本中的条件,计算一个值在电子表格列中出现的次数

  27. 27

    计算字符串的出现次数,并对大文件中的下一个逗号值求和

  28. 28

    计算两个日期之间一周中的每一天的发生次数

  29. 29

    Spark-在两个不同的列中查找每个不同值的总出现次数

热门标签

归档