gpt4 book ai didi

r - 在整个数据框中查找多个字符串

转载 作者:行者123 更新时间:2023-12-02 09:07:17 24 4
gpt4 key购买 nike

我正在尝试使用 which 函数在数据框中查找多个字符串。我试图扩展 Find string in data.frame 的答案

示例数据框是:

df1 <- data.frame(animal=c('a','b','c','two', 'five', 'c'), level=c('five','one','three',30,'horse', 'five'), length=c(10, 20, 30, 'horse', 'eight', 'c'))

1      a  five     10
2 b one 20
3 c three 30
4 two 30 horse
5 five horse eight
6 c five c

在这个数据帧上,当我对一个字符串应用哪个函数时,我得到了正确的输出,例如 which(df1 =="c" , arr.ind = T);df1给出:

  row col
[1,] 3 1
[2,] 6 1
[3,] 6 3

但是当我尝试搜索多个字符串时,我只得到部分正确的输出,例如 which(df1 ==c("c", "horse", "five") , arr.ind = T)

  row col
[1,] 5 2
[2,] 6 2

预期输出应该是:

     row col
[1,] 3 1
[2,] 5 1
[3,] 6 1
[4,] 1 2
[5,] 5 2
[6,] 6 2
[7,] 4 3
[8,] 6 3

因此我的问题是:

  1. 为什么 c("c", "horse", "Five") 的解决方案不起作用?

  2. 我尝试过

which(df1=="c" | df1=="horse" | df1 =="five", arr.ind = T)

这给了我正确的输出,但对于许多字符串来说太长了,如何使我的代码简洁?

最佳答案

我们可以使用lapply循环遍历向量,执行==,使用|<将其减少为单个逻辑矩阵 并用 which 包裹起来

which(Reduce(`|`, lapply(c("c", "horse", "five"), `==`, df1)), arr.ind = TRUE)
# row col
#[1,] 3 1
#[2,] 5 1
#[3,] 6 1
#[4,] 1 2
#[5,] 5 2
#[6,] 6 2
#[7,] 4 3
#[8,] 6 3

或者另一种选择是使用 mutate_all 循环遍历数据集的列,并使用 which 换行

library(dplyr)
df1 %>%
mutate_all(list(~ . %in% c("c", "horse", "five"))) %>%
as.matrix %>%
which(., arr.ind = TRUE)

注意:在这里,如果OP想要进行完整的字符串匹配,我们不需要任何正则表达式或部分匹配。它应该比进行任何部分匹配更快


通常,对于多个元素 %in% 会很有用,但是,它仅适用于向量而不是 data.frame

关于r - 在整个数据框中查找多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56583161/

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