2017-03-09 41 views
1

总结了data.frame中的样本的唯一计数我有一个制表符分隔的表,它看起来像这样(它的巨大,“源”列中的条目一直延伸到1000万行):使用R

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(不考虑一箱是否有一个以上的条目)

每“宾”的条目对所有其他的独特的计数垃圾桶应

Bin1 Bin2 Bin3 Bin4 Bin5  
0  5  2  1  0 
+0

我真的很难理解你想要计算什么。你会介意在这个例子中进一步解释共享条目的总和应该是多少?为什么它是'2'?与“每个垃圾桶条目的唯一数量”一样,究竟应该计算什么? – LAP

+1

狮子座,我想要得到的是每个行中的元素(基于第1列=“源”),这是所有分支共有的元素。在这里,元素/值是1到n(非零)并不重要;例如A和B都存在于所有的箱子中,因此它们被算作2个元素。其次,我想得到唯一元素的值相对于所有其他元素的唯一元素的总和(即,列Bin1与Bin2与Bin3与Bin4与Bin5 ...) – Daudi

回答

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)。 对于一千万行,可能需要对数据块执行此操作,并生成累加求和。

+0

谢谢Lespied,但是这不起作用。我已经得到以下错误。 colSums中的错误(df [rowSums(df> 0)== 1,]):'x'必须是数字 另外:警告消息: 在Ops.factor(左,右):'>'对于因素没有意义 – Daudi

+0

看到更新后的表命令,我用源列作为rownames而不是明确的列。如果这是一个问题,更改命令会更容易。 – Lespied

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的组合中迷失了方向。这可能会减少代码,但至少可以这样工作。解决方案

+0

伟大的利奥,为第一个问题工作!假设我也想得到每个bin的这些“sum_of_shared_entries”的总值。通过单元1至5的简单计算,这些值分别为2,2,3,3和4。我如何将它添加到代码中(除了第二个以前的问题)。 – Daudi

+0

请参阅编辑仓位和。 – LAP

+0

查看另一个编辑回答你的第二部分。 – LAP