gpt4 book ai didi

r - 在多个列上嵌套 if else 语句

转载 作者:行者123 更新时间:2023-12-04 09:41:05 25 4
gpt4 key购买 nike

我有一个大 data.frame其中前三列包含有关 的信息标记 .其余列是每个个体中该标记的数字类型。每个人有三列。数据集如下所示:

                      marker alleleA alleleB   X818 X818.1 X818.2   X345 X345.1 X345.2   X346 X346.1 X346.2
1 kgp5209280_chr3_21902067 T A 0.0000 1.0000 0.0000 1.0000 0.0000 0.0000 0.0000 1.0000 0.0000
2 chr3_21902130_21902131_A_T A T 0.8626 0.1356 0.0018 0.7676 0.2170 0.0154 0.8626 0.1356 0.0018
3 chr3_21902134_21902135_T_C T C 0.6982 0.2854 0.0164 0.5617 0.3749 0.0634 0.6982 0.2854 0.0164

也就是说,对于每个标记(行),每个人都有三个值,每列一个。

我要新建一个 data.frame它具有与原始中相同的所有行,但每个人只有一列。在每个人的一列中,我希望每个人的三个值中大于 0.8。如果没有大于 0.8 的值,那么我想打印 NA。例如,在我为第一行给出的数据集中,我想要 818 (1.0000) 的第二个值和 345 (1.0000) 的第一个值。在第二行,我想要 818 (0.8626) 的第一个值,对于 345,没有一个值大于 0.8,所以我想要打印 NA 等等。因此,新数据集将如下所示:
                     marker alleleA alleleB   X818 X345
1 kgp5209280_chr3_21902067 T A 1.0000 1
2 chr3_21902130_21902131_A_T A T 0.8626 NA

我一直在尝试使用 if/else声明,沿着 if [, 4] > 0.8 then [, 4], else...但是它似乎没有给我我想要的东西,而且我还必须循环这个命令,所以它不仅对前三列中的一个人执行,而且对所有列执行。

任何帮助,将不胜感激!提前致谢。

最佳答案

编辑:使用在 data.table 中实现的快速熔化/dcast 方法更新解决方案版本 >= 1.9.0。去 here了解更多信息。

require(data.table)
require(reshape2)
dt <- as.data.table(df)

# melt data.table
dt.m <- melt(dt, id=c("marker", "alleleA", "alleleB"),
variable.name="id", value.name="val")
dt.m[, id := gsub("\\.[0-9]+$", "", id)] # replace `.[0-9]` with nothing
# aggregation
dt.m <- dt.m[, list(alleleA = alleleA[1],
alleleB = alleleB[1], val = max(val)),
keyby=list(marker, id)][val <= 0.8, val := NA]
# casting back
dt.c <- dcast.data.table(dt.m, marker + alleleA + alleleB ~ id)
# marker alleleA alleleB X345 X346 X818
# 1: chr3_21902130_21902131_A_T A T NA 0.8626 0.8626
# 2: chr3_21902134_21902135_T_C T C NA NA NA
# 3: kgp5209280_chr3_21902067 T A 1 1.0000 1.0000

解决方案1:可能不是最好的方法,但这是我目前能想到的:
mm <- t(apply(df[-(1:3)], 1, function(x) tapply(x, gl(3,3), max)))
mode(mm) <- "numeric"
mm[mm < 0.8] <- NA
# you can set the column names of mm here if necessary
out <- cbind(df[, 1:3], mm)

# marker alleleA alleleB 1 2 3
# 1 kgp5209280_chr3_21902067 T A 1.0000 1 1.0000
# 2 chr3_21902130_21902131_A_T A T 0.8626 NA 0.8626
# 3 chr3_21902134_21902135_T_C T C NA NA NA
gl(3,3)给出一个因子值 1,1,1,2,2,2,3,3,3与水平 1,2,3 .即, tapply将取值 x一次 3 个并获得他们的 max (前 3 个,接下来的 3 个和最后 3 个)。和 apply逐行发送。

解决方案2:一个 data.table使用 melt 的解决方案和 castdata.table 没有 使用 reshapereshape2 :
require(data.table)
dt <- data.table(df)
# melt your data.table to long format
dt.melt <- dt[, list(id = names(.SD), val = unlist(.SD)),
by=list(marker, alleleA, alleleB)]
# replace `.[0-9]` with nothing
dt.melt[, id := gsub("\\.[0-9]+$", "", id)]
# get max value grouping by marker and id
dt.melt <- dt.melt[, list(alleleA = alleleA[1],
alleleB = alleleB[1],
val = max(val)),
keyby=list(marker, id)][val <= 0.8, val := NA]
# edit mnel (use setattr(,'names') to avoid copy by `names<-` within `setNames`
dt.cast <- dt.melt[, as.list(setattr(val,'names', id)),
by=list(marker, alleleA, alleleB)]

# marker alleleA alleleB X345 X346 X818
# 1: chr3_21902130_21902131_A_T A T NA 0.8626 0.8626
# 2: chr3_21902134_21902135_T_C T C NA NA NA
# 3: kgp5209280_chr3_21902067 T A 1 1.0000 1.0000

关于r - 在多个列上嵌套 if else 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15510566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com