在 10,000 行的数据集中识别至少一列显示不同等位基因的行

问题描述 投票:0回答:2

例如我的数据如下所示:

身份证 1160 1160 1216 1216 1132 1132
01 T T T T T T
02 T T T T T G
03 A G 不适用 不适用 A A
04
05 不适用 不适用 不适用 不适用 不适用 不适用
06 G G G G G G

我期待的结果是:

身份证 1160 1160 1216 1216 1132 1132
02 T T T T T G
03 A G 不适用 不适用 A A
r sorting
2个回答
2
投票

您可以计算唯一值的数量并保留有多个的行。

dat[
    sapply(data.frame(t(dat[, -1])), \(x) length(unique(na.omit(x))) > 1),
]
  ID 1160 1160 1216 1216 1132 1132
2  2    T    T    T    T    T    G
3  3    A    G <NA> <NA>    A    A

或者如果你想要一个

dplyr
方法,你可以这样做:

library(dplyr)
dat  |>
    rowwise()  |>
    filter(n_distinct(na.omit(c_across(X1160:X1132.1))) > 1)    

我怀疑这会慢得多。另外,我使用

check.names = TRUE
来修复此示例中的列名称,因为您有重复项。

数据

dat  <- structure(list(ID = 1:6, `1160` = c("T", "T", "A", "I", NA, "G"
), `1160` = c("T", "T", "G", "I", NA, "G"), `1216` = c("T", "T", 
NA, "I", NA, "G"), `1216` = c("T", "T", NA, "I", NA, "G"), `1132` = c("T", 
"T", "A", "I", NA, "G"), `1132` = c("T", "G", "A", "I", NA, "G"
)), class = "data.frame", row.names = c(NA, -6L))

1
投票

使用

data.table::uniqueN

> library(data.table)
> setDT(dat)
> DT[DT[, .(unique_values=uniqueN(unlist(.SD))), by=ID]$unique_values > 1L]
   ID X1160 X1160.1 X1216 X1216.1 X1132 X1132.1
1: 02     T       T     T       T     T       G
2: 03     A       G  <NA>    <NA>     A       A

数据:

> dput(dat)
structure(list(ID = c("01", "02", "03", "04", "05", "06"), X1160 = c("T", 
"T", "A", "I", NA, "G"), X1160.1 = c("T", "T", "G", "I", NA, 
"G"), X1216 = c("T", "T", NA, "I", NA, "G"), X1216.1 = c("T", 
"T", NA, "I", NA, "G"), X1132 = c("T", "T", "A", "I", NA, "G"
), X1132.1 = c("T", "G", "A", "I", NA, "G")), class = "data.frame", row.names = c(NA, 
-6L))
© www.soinside.com 2019 - 2024. All rights reserved.