【问题标题】:Count how many times a vector/row matches data frame计算向量/行匹配数据帧的次数
【发布时间】:2016-10-11 14:22:37
【问题描述】:

我有一个带有“正”(1)或“负”(0)数据点的大型数据框。

数据示例

my_data <- data.frame(cell = 1:4, marker_a = c(1, 0, 0, 0), 
  marker_b = c(0,1,1,1), marker_c = c(0,1,1,0), marker_d = c(0,1,0,1))


  cell marker_a marker_b marker_c marker_d
1    1        1        0        0        0
2    2        0        1        1        1
3    3        0        1        1        0
4    4        0        1        0        1
...

我有一个不同的data.frame,其中包含任何my_data$cell 可以有的所有可能的正负标记组合

combinations_df <- expand.grid(
    marker_a = c(0, 1), 
    marker_b = c(0, 1), 
    marker_c = c(0, 1), 
    marker_d = c(0, 1)
)

   marker_a marker_b marker_c marker_d
1         0        0        0        0
2         1        0        0        0
3         0        1        0        0
4         1        1        0        0
5         0        0        1        0
6         1        0        1        0
7         0        1        1        0
8         1        1        1        0
9         0        0        0        1
10        1        0        0        1
11        0        1        0        1
12        1        1        0        1
13        0        0        1        1
14        1        0        1        1
15        0        1        1        1
16        1        1        1        1

如何获得data.frame,其中每行/组合与 my_data 的每一行匹配,并返回每个组合的最终计数

预期输出示例:

      1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16
1 14969 15223 15300 14779 14844 16049 15374 15648 15045 15517 15116 15405 14990 15347 14432 15569

【问题讨论】:

  • 能否根据您展示的示例更新您的预期输出?

标签: r dataframe


【解决方案1】:

我猜 data.table 的方式相当有效:

library(data.table)
setDT(my_data)

my_data[ combinations_df, on = names(combinations_df), .N, by = .EACHI ]


    marker_a marker_b marker_c marker_d N
 1:        0        0        0        0 0
 2:        1        0        0        0 1
 3:        0        1        0        0 0
 4:        1        1        0        0 0
 5:        0        0        1        0 0
 6:        1        0        1        0 0
 7:        0        1        1        0 1
 8:        1        1        1        0 0
 9:        0        0        0        1 0
10:        1        0        0        1 0
11:        0        1        0        1 1
12:        1        1        0        1 0
13:        0        0        1        1 0
14:        1        0        1        1 0
15:        0        1        1        1 1
16:        1        1        1        1 0

如果您只关心数据中显示的组合,请“链接”过滤命令:

my_data[ combinations_df, on = names(combinations_df), .N, by = .EACHI ][ N > 0 ]


   marker_a marker_b marker_c marker_d N
1:        1        0        0        0 1
2:        0        1        1        0 1
3:        0        1        0        1 1
4:        0        1        1        1 1

或者,在这种情况下,您甚至不需要combinations_df...

my_data[, .N, by = marker_a:marker_d ]


   marker_a marker_b marker_c marker_d N
1:        1        0        0        0 1
2:        0        1        1        1 1
3:        0        1        1        0 1
4:        0        1        0        1 1

【讨论】:

    【解决方案2】:

    你正在用“二进制”编写你的组合,所以不需要任何连接,只需要很少的数学运算。试试这个:

    setNames(tabulate(as.matrix(my_data[,2:5])%*%2^(0:3)+1,16),1:16)
    # 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 
    # 0  1  0  0  0  0  1  0  0  0  1  0  0  0  1  0
    

    【讨论】:

      【解决方案3】:

      也许你需要

      setNames(sapply(do.call(paste0, combinations_df ), 
               function(x) sum(do.call(paste0, my_data[-1])==x)), 1:nrow(combinations_df ))
      

      【讨论】:

        猜你喜欢
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多