r - 使用 data.table 跨多个列过滤字符串
问题描述
我有一个看起来像这样的数据集。
df <- tibble::tribble(
~name, ~x, ~y, ~z,
"N/A", 1, "testSmith", -100,
"N A", 3, "NOt available", -99,
"test Smith", NA, "test Smith", -98,
"Not Available", -99, "25", -101,
"test Smith", -98, "28", -1)
我想创建一个新的data.table,将所有行都保留为字符串“test”。
最终的数据集应该是这样的
name x y z
<chr> <dbl> <chr> <dbl>
1 N/A 1 testSmith -100
2 test Smith NA test Smith -98
3 test Smith -98 28 -1
我可以像这样逐列做这个
setDT(df)[name%like%"test"|y%like%"test"]
这种方法的问题是我有数百个字符串变量,我想找到一种更紧凑的方法。我尝试了以下方法,但它们不起作用
chvar <- keep(trai,is.character)%>%names()
setDT(df)[chvar%like%"test"]#error
setDT(df)[(chvar)%like%"test"]#error
setDT(df)[.(chvar)%like%"test"]#empty dt
有人知道我如何以快速有效的方式做到这一点吗?
非常感谢你的帮助
解决方案
你data.table
可以这样做:
library(data.table)
cols <- c('name', 'y')
setDT(df)
df[df[, Reduce(`|`, lapply(.SD, `%like%`, "test")), .SDcols = cols]]
# name x y z
#1: N/A 1 testSmith -100
#2: test Smith NA test Smith -98
#3: test Smith -98 28 -1
在基础 R 中:
subset(df, Reduce(`|`, lapply(df[cols], function(x) grepl('test', x))))
dplyr
:
library(dplyr)
df %>% filter(Reduce(`|`, across(all_of(cols), ~grepl('test', .x))))
lapply
/across
返回所有列的TRUE
/FALSE
值列表。TRUE
如果'test'
存在和不存在,它将返回FALSE
。当我们将它与 and 结合使用时Reduce
,|
它只会给TRUE
出行中至少有一个TRUE
值。如果该行中的所有值都是FALSE
它将返回FALSE
。我们只选择那些至少有一个TRUE
值的行。
推荐阅读
- angular - Primeng Dropdown 未绑定 Angular FormArray 中的选项
- kubernetes - GKE 节点绑定到网关
- swift - 使用 ARKit 在 xcode 中动画图形
- mysql - MySQL:如果另一列在联结表中有两个确定的值,则从一列中选择不同的值
- git - Git tag --contains [hash] 提供了意想不到的结果
- java - 抽象类中的异步方法
- typescript - 打字稿:限制字段类型并推断其余字段
- python - 尝试在继承类中导入基类时,为什么会出现导入错误(无法导入名称)?
- reactjs - 如何使用 firestoreConnect 从 ReactJS 中的道具将对象添加到状态?
- c# - Bot Framework v4 + Slack = 无按钮