如何在 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
来计算唯一值的数量,我们可以对 Population
和 Method
中的每个唯一值进行计算,然后计算每个值的比率 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))
我认为,我一直在努力完成 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
来计算唯一值的数量,我们可以对 Population
和 Method
中的每个唯一值进行计算,然后计算每个值的比率 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))