如何比较R中分组的重复行
我有一个数据集,其中样本/基因通过匹配ID进行分组。我试图比较匹配ID的组 例如,我有:如何比较R中分组的重复行,r,dataframe,data.table,R,Dataframe,Data.table,我有一个数据集,其中样本/基因通过匹配ID进行分组。我试图比较匹配ID的组 例如,我有: ID Gene Score 1:10 Gene1 0.8 1:10 Gene1 0.78 1:10 Gene4 0.6 2:20 Gene5 0.1 2:20 Gene6 0.7 3:30 Gene7 0.4 3:30 Gene8 0.6 3:30 Gene8 0.5 我试图找到各种统计数据
ID Gene Score
1:10 Gene1 0.8
1:10 Gene1 0.78
1:10 Gene4 0.6
2:20 Gene5 0.1
2:20 Gene6 0.7
3:30 Gene7 0.4
3:30 Gene8 0.6
3:30 Gene8 0.5
我试图找到各种统计数据,比如组中超过1个基因得分>0.7的匹配ID组的百分比(从我的示例数据来看,这将是33.3%的匹配ID组具有该得分),或者有多少组在相同的匹配ID下有0.7分的基因和0.1分的基因(本例中33.3%的组)
我一直在尝试使用duplicated()
和filter()
来启动此功能,但除此之外,我不确定要尝试哪些函数,请提供有关要尝试的函数的任何建议
输入数据:
structure(list(ID = c("1:10", "1:10", "1:10", "2:20", "2:20",
"3:30", "3:30", "3:30"), Gene = c("Gene1", "Gene1", "Gene4",
"Gene5", "Gene6", "Gene7", "Gene8", "Gene8"), Score = c(0.8,
0.78, 0.6, 0.1, 0.7, 0.4, 0.6, 0.5)), row.names = c(NA, -8L), class = c("data.table",
"data.frame"))
库(“dplyr”)
df 0.7
df%>%
分组依据(ID)%>%
汇总(cond=总和(分数>0.7)>1)%>%
替换_na(列表(cond=FALSE))%>%
汇总(分数=总和(cond)/n()
#一个tibble:1x1
压裂
1 0.333
ID组至少有一个基因得分为0.7,至少有一个基因得分为0.1
df %>%
group_by(ID, Gene) %>%
summarize(cond = any(Score %in% c(0.1, 0.7))) %>%
replace_na(list(cond = FALSE)) %>%
group_by(ID) %>%
summarize(cond = any(cond)) %>%
summarize(frac = sum(cond) / n())
# A tibble: 1 x 1
frac
<dbl>
1 0.333
df%>%
分组依据(ID,基因)%>%
总结(cond=any(分数%c(0.1,0.7))%>%
替换_na(列表(cond=FALSE))%>%
分组依据(ID)%>%
汇总(cond=any(cond))%>%
汇总(分数=总和(cond)/n()
#一个tibble:1x1
压裂
1 0.333
库(“dplyr”)
df 0.7
df%>%
分组依据(ID)%>%
汇总(cond=总和(分数>0.7)>1)%>%
替换_na(列表(cond=FALSE))%>%
汇总(分数=总和(cond)/n()
#一个tibble:1x1
压裂
1 0.333
ID组至少有一个基因得分为0.7,至少有一个基因得分为0.1
df %>%
group_by(ID, Gene) %>%
summarize(cond = any(Score %in% c(0.1, 0.7))) %>%
replace_na(list(cond = FALSE)) %>%
group_by(ID) %>%
summarize(cond = any(cond)) %>%
summarize(frac = sum(cond) / n())
# A tibble: 1 x 1
frac
<dbl>
1 0.333
df%>%
分组依据(ID,基因)%>%
总结(cond=any(分数%c(0.1,0.7))%>%
替换_na(列表(cond=FALSE))%>%
分组依据(ID)%>%
汇总(cond=any(cond))%>%
汇总(分数=总和(cond)/n()
#一个tibble:1x1
压裂
1 0.333
为了完整起见,并且因为问题有数据。表
标签:
ds[, any(Score > 0.7), by = .(ID)][, sum(V1)/length(V1)]
或
为了验证结果是否正确,我们可以在链接的数据中集成print()
语句。表表达式:
ds[, any(Score > 0.7), by = .(ID)][, print(.SD)][, sum(V1)/length(V1)]
资料
库(data.table)
ds为了完整性,并且因为问题有一个数据。表
标签:
ds[, any(Score > 0.7), by = .(ID)][, sum(V1)/length(V1)]
或
为了验证结果是否正确,我们可以在链接的数据中集成print()
语句。表表达式:
ds[, any(Score > 0.7), by = .(ID)][, print(.SD)][, sum(V1)/length(V1)]
资料
库(data.table)
ds谢谢,这看起来非常清晰,对我来说也很容易使用。我已经在我的真实数据上尝试过了,它返回的结果都是NA,并且有一条消息:summary()`ungroup output(用`groups`参数覆盖)
-我还需要为我的真实数据做些什么吗?与示例数据相比,你的真实数据看起来是什么样的?列中的一些行是NA,没有分数,这是唯一的区别,除了构成数据集的另外两列之外,管理解决了我的NAs问题,现在可以了-谢谢你的回复谢谢你,thi对我来说,s看起来非常清晰且易于使用。我已经在实际数据上尝试过它,但它返回的结果都是NA,并且有一条消息:summary()`解组输出(用`.groups`参数覆盖)
-对于我的真实数据,我还需要做些什么吗?与示例数据相比,您的真实数据看起来是什么样的?列中的某些行是NA,没有分数,这是唯一的区别,除了组成数据集的另外两个列管理解决了我的NAs问题,现在可以了-感谢您的回复
ds[, any(Score %in% c(0.1, 0.7)), by = .(ID)][, sum(V1)/length(V1)]
[1] 0.3333333
ds[, any(Score > 0.7), by = .(ID)][, print(.SD)][, sum(V1)/length(V1)]
ID V1
1: 1:10 TRUE
2: 2:20 FALSE
3: 3:30 FALSE
[1] 0.3333333
library(data.table)
ds <- structure(list(ID = c("1:10", "1:10", "1:10", "2:20", "2:20",
"3:30", "3:30", "3:30"), Gene = c("Gene1", "Gene1", "Gene4",
"Gene5", "Gene6", "Gene7", "Gene8", "Gene8"), Score = c(0.8,
0.78, 0.6, 0.1, 0.7, 0.4, 0.6, 0.5)), row.names = c(NA, -8L), class = c("data.table",
"data.frame"))