首页 > 解决方案 > 如何对 R 数据表的所有行中的值使用条件

问题描述

我认为,我一直在努力解决 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)]

但这似乎不起作用。我确实认为我一定不会太远但找不到它,

谢谢

埃迪

标签: rdata.tablesapply

解决方案


您可以使用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))

推荐阅读