根据 R 中的内容删除/保留特定列

Posted

技术标签:

【中文标题】根据 R 中的内容删除/保留特定列【英文标题】:Removing/keeping specific columns based off their contents in R 【发布时间】:2022-01-01 06:49:46 【问题描述】:

df:实际上有成千上万的变体和 ID

     variant1 variant2 variant3 variant4
ID1   0/0         0/0      0/0     0
ID2   0/0         0/0      0/0     0
ID3   0/0         0/0      1/1     0
ID4   0/0         0/0      0/0     1
ID5   0/1         0/0      0/0     0

期望的结果:

     variant1 variant2 variant3 variant4


ID3   0/0         0/0      1/1     0
ID4   0/0         0/0      0/0     1
ID5   0/1         0/0      0/0     0

我只想保留包含 0/1、1/1 或 1 的行。

我在每次迭代时都尝试过dt[grepl(0/1", df),],但它似乎不起作用。

是否有基本的 R 或 data.table 方式来执行此操作?

【问题讨论】:

【参考方案1】:

我们可以使用来自dplyrif_any

library(dplyr)
dt %>%
    filter(if_any(everything(), ~ . %in% c("0/1", "1/1", "1")))

-输出

    variant1 variant2 variant3 variant4
ID3      0/0      0/0      1/1        0
ID4      0/0      0/0      0/0        1
ID5      0/1      0/0      0/0        0

或使用base R

dt[ Reduce(`|`, lapply(dt, `%in%`, c("0/1", "1/1", "1"))),]

-输出

    variant1 variant2 variant3 variant4
ID3      0/0      0/0      1/1        0
ID4      0/0      0/0      0/0        1
ID5      0/1      0/0      0/0        0

data.table中可以使用相同的选项

library(data.table)
setDT(dt)[dt[, Reduce(`|`, lapply(.SD, `%in%`, c("0/1", "1/1", "1")))]]

数据

dt <- structure(list(variant1 = c("0/0", "0/0", "0/0", "0/0", "0/1"
), variant2 = c("0/0", "0/0", "0/0", "0/0", "0/0"), variant3 = c("0/0", 
"0/0", "1/1", "0/0", "0/0"), variant4 = c("0", "0", "0", "1", 
"0")), row.names = c("ID1", "ID2", "ID3", "ID4", "ID5"), class = "data.frame")

【讨论】:

感谢您抽出宝贵时间回复,这非常有效。 “|”是什么意思Reduce 中的函数是什么意思? data.table中的“.SD”是否意味着适用于整个表? @tacrolimus | 是 OR 运算符。它从lapply 的列表输出中检查每个向量中的元素 OR,并返回一个 TRUE/FALSE 向量。即,如果在同一位置有一个 TRUE,则返回 TRUE,否则返回 FALSE。 2) .SD - data.table 的子集。如果我们没有在.SDcols 中指定任何内容,它将占用整个列

以上是关于根据 R 中的内容删除/保留特定列的主要内容,如果未能解决你的问题,请参考以下文章

根据不同列中的值删除重复项

R:从R中的大型数据集中根据列中的值删除行[重复]

根据 R 中的特定列名从字符向量中删除逗号

根据标题删除特定列

根据R中的2列删除重复的行

有条件地删除R中的行