使用R

时间:2017-03-09 08:27:25

标签: r

我有一个制表符分隔表,看起来像这样(它很大,“源”列中的条目一直到1000万行):

source    Bin1    Bin2    Bin3    Bin4    Bin5
  A         1       1       2       2       3
  B         1       1       1       1       1
  C         0       0       0       1       0
  D         0       0       2       0       0
  E         4       0       0       1       0
  F         1       0       1       2       1
  G         0       5       0       0       0

我想用R(或perl)从这个表中得到两件事:
(1)共享条目的总和等于或大于1;
(2)基于相对于所有其他箱的“源”列,每列“Bin1-5”的唯一条目

在这种情况下,基于“来源”的共享条目总和为2(无论bin是否有多个条目)

每个“Bin”对所有其他Bins的唯一条目数应为

Bin1    Bin2    Bin3    Bin4    Bin5    
0       5       2       1       0

2 个答案:

答案 0 :(得分:0)

df <- data.frame("source" = LETTERS[1:7], "Bin1" = c(1,1,0,0,4,1,0), "Bin2" = c(1,1,0,0,0,0,5), "Bin3" = c(2,1,0,2,0,1,0),
             "Bin4" = c(2,1,1,0,1,2,0), "Bin5" = c(3,1,0,0,0,1,0), row.names = 1)

colSums(df[rowSums(df > 0) == 1, ])

df > 0将您的数据转换为逻辑数组,如果您对行(rowSums)求和并找到它等于1的位置,则会得到一个数组,其中的行只包含一个值。然后计算这些角色的列(colSums)的总和。 有一千万行,可能需要对数据块执行此操作,并生成累积求和。

答案 1 :(得分:0)

好的,共享条目总和的部分答案。

df <- data.frame("source" = LETTERS[1:7], "Bin1" = c(1,1,0,0,4,1,0), "Bin2" = c(1,1,0,0,0,0,5), "Bin3" = c(2,1,0,2,0,1,0),
               "Bin4" = c(2,1,1,0,1,2,0), "Bin5" = c(3,1,0,0,0,1,0))

sum_of_shared_entries <- length(which(apply(df[,-1], 1, function(x) all(x > 0))))

> sum_of_shared_entries
[1] 2

编辑:行的总和可以通过以下方式获得:

colsum_of_shared_entries <- colSums(df[which(apply(df[,-1], 1, function(x) all(x > 0))), -1])

> colsum_of_shared_entries
Bin1 Bin2 Bin3 Bin4 Bin5 
  2    2    3    3    4

回答问题的第二部分:每个箱子的唯一计数总和可以通过以下方式获得:

sum_of_unique_counts <- colSums(df[which(lapply(apply(df[,-1], 1, function(x) which(x > 0)), length) == 1),-1])

> sum_of_unique_counts
Bin1 Bin2 Bin3 Bin4 Bin5 
   0    5    2    1    0 

有人可能会重新审视第二部分的代码,我可能已经迷失在whichapply的组合中。这可能是用更少的代码实现的,但至少它的工作方式是这样的。解决方案