我有一个制表符分隔表,看起来像这样(它很大,“源”列中的条目一直到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
答案 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
有人可能会重新审视第二部分的代码,我可能已经迷失在which
和apply
的组合中。这可能是用更少的代码实现的,但至少它的工作方式是这样的。解决方案