r - 根据匹配列和不匹配列的组合选择行
问题描述
我有一张这样的桌子:
data <- data.frame(a = c("0/0", "0/1", "0/0", "0/0" ),
b = c("0/1", "./.", "0/1", "0/0"),
c = c("1/0", "0/0", "1/1", "0/0"),
d = c("1/0", "0/0", "1/1", "0/0"),
f = c("L", "L", "T", "L"))
我想选择任何包含至少一个 0/1 或 1/0 并且没有 ./ 的行。在 a、b 和 c 列中,并且与 f 列中的 L 匹配。
我正在尝试使用库data.table
data[data$a %like% "0/1|1/0" | data$b %like% "0/1|1/0"| data$c %like% "0/1|1/0" & !(data$a %like% "./.") & !(data$b %like% "./.") & !(data$c %like% "./.") & data$f == "L", ]
但它不起作用。
该表如下所示:
a b c d f
1 0/0 0/1 1/0 1/0 L
2 0/1 ./. 0/0 0/0 L
3 0/0 0/1 1/1 1/1 T
4 0/0 0/0 0/0 0/0 L
所需的输出应如下所示:
a b c d f
1 0/0 0/1 1/0 1/0 L
你知道我怎么能做到这一点吗?
解决方案
data[ apply(sapply(data[1:4], `%in%`, c('0/1','1/0')), 1, any) &
apply(sapply(data[1:3], Negate(`%in%`), c('./.')), 1, all) &
data$f == "L", ]
# a b c d f
# 1 0/0 0/1 1/0 1/0 L
分解:
sapply(data[1:4], `%in%`, c('0/1','1/0'))
# a b c d
# [1,] FALSE TRUE TRUE TRUE
# [2,] TRUE FALSE FALSE FALSE
# [3,] FALSE TRUE FALSE FALSE
# [4,] FALSE FALSE FALSE FALSE
这为我们提供了前四列中具有两种“想要”模式之一的实例。我们想要任何列都有它的行,所以我们在它们之间“任意”:
apply(sapply(data[1:4], `%in%`, c('0/1','1/0')), 1, any)
# [1] TRUE TRUE TRUE FALSE
同样,找到具有“不想要”模式的那些:
sapply(data[1:3], Negate(`%in%`), c('./.'))
# a b c
# [1,] TRUE TRUE TRUE
# [2,] TRUE FALSE TRUE
# [3,] TRUE TRUE TRUE
# [4,] TRUE TRUE TRUE
apply(sapply(data[1:3], Negate(`%in%`), c('./.')), 1, all) # notice "all", not "any"
# [1] TRUE FALSE TRUE TRUE
现在我们希望在最后一列 ( =="L"
) 中有“L”,直接用 将它们逻辑链接起来&
。
推荐阅读
- graphql - GraphQL Apollo 移除悬空引用
- python-3.x - 如何在python中旋转3D文本?
- vba - 如何将文本从 Word 文档复制到 PowerPoint 并进行演示
- javascript - 滚动页面时如何删除活动类
- php - 攻击联系表
- java - 我想在片段中添加秒表,但应用程序在单击图像按钮时崩溃。如何解决?
- jquery - 单击事件调用(按键)不起作用
- cookies - 谷歌云 CDN 变化:cookie 响应永远不会被缓存命中
- mysql - 如何解决 phpmyadmin 错误?
- javascript - JS - 在画布中围绕鼠标位置制作一个hitbox?