如何在 R 数据表的所有行中使用值条件

How to use conditions on value in all rows of a R datatable

我认为,我一直在努力完成 R 中的一项基本任务,但我在这方面仍然是新手,无法通过我找到的论坛实现它。

这是我的数据集:

       Read SNP.mapped DEL.mapped INS.mapped SNP.true DEL.true INS.true       Method Population
   1:    0          0          0          0        0        0        0 E_B1    E     
   2:    1          0          0          0        0        0        0 E_B1    E     
   3:  100          0          0          0        0        0        0 E_B1    E     
   4: 1000          0          0          0        0        0        0 E_B1    E     
   5: 100B          0          0          0        0        0        0 E_B1    E     
   ...
   30657866:  ZZ2          0          0          0        0        0     0 C_N9    C     
   30657867:  ZZI          0          0          0        0        0     0 C_N9    C     
   30657868:  ZZO          0          0          0        1        0     0 C_N9    C     
   30657869:  ZZV          0          0          0        0        0     0 C_N9    C     
   30657870:  ZZZ          0          0          0        0        0     0 C_N9    C     

这是我想要在名为“all.dataSNP0”的数据表的第一行实现的示例:

length(unique(all.dataSNP0$Read[which(all.dataSNP0$Population =="C" & all.dataSNP0$Method =="C_B1")])) / length(unique(all.dataSNP0$Read[which(all.dataSNP0$Population=="C")]))

结果是我所期望的并且工作得很好。但是现在我正在尝试将此行应用于所有列,但我不知道如何在循环遍历它时在条件中使用该列的实际值。我试过这样做:

all.dataSNP0[, Ratio:=sapply(length(unique(all.dataSNP0$Read[which(Population == .Population & Method == .Method)])) / length(unique(all.dataSNP0$Read[which(Population== .Population)])), "[",1)]

不过好像不行。我想我应该不是太远但是找不到,

谢谢

埃迪

您可以使用 uniqueN 来计算唯一值的数量,我们可以对 PopulationMethod 中的每个唯一值进行计算,然后计算每个值的比率 Population.

library(data.table)
all.dataSNP0[, count := uniqueN(Read), .(Population, Method)]
all.dataSNP0[, count := count/sum(count), Population]

同样可以使用 dplyr 来完成:

library(dplyr)

all.dataSNP0 %>%
  group_by(Population, Method) %>%
  mutate(count = n_distinct(Read)) %>%
  group_by(Population) %>%
  mutate(count = count/sum(count))