在 R 中,检查字符串是否出现在数据框的行中(在任何列中)

Can*_*ice 8 r

temp = structure(list(name1 = structure(c(2L, 1L, 2L, 1L, 2L), .Label = c("Joe", 
"Mike"), class = "factor"), name2 = c("Nick", "Matt", "Nick", 
"Matt", "Nick"), name3 = c("Matt", "Tom", "Tom", "Steve", "Tom"
)), .Names = c("name1", "name2", "name3"), row.names = c(NA, 
-5L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

大家好,

我对 R 有一个简单的编码问题。请参阅下面的数据框,其代码在上面:

  name1 name2 name3
1  Mike  Nick  Matt
2   Joe  Matt   Tom
3  Mike  Nick   Tom
4   Joe  Matt Steve
5  Mike  Nick   Tom
Run Code Online (Sandbox Code Playgroud)

我想要一个简单的函数,它返回一个布尔向量,指示特定名称是否出现在此数据帧的一行(在任何列中)中。例如:

myfunction(Matt) 

# should return
c(TRUE, TRUE, FALSE, TRUE, FALSE).
Run Code Online (Sandbox Code Playgroud)

因为马特出现在第一、第二和第四行。感谢您对此的任何简单帮助,谢谢!

www*_*www 7

这是一个选项。使用apply和匹配 ( %in%)。

apply(temp, 1, function(x) any(x %in% "Matt")) 
[1]  TRUE  TRUE FALSE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)


Can*_*ice 6

我也提出了自己的解决方案:

rowSums("Matt" == temp) > 0 
Run Code Online (Sandbox Code Playgroud)

似乎可以解决问题


Dav*_*rds 5

此解决方案使用dplyrpurrr

myFunction <- function(df, name) {
  by_row(df, function(x) {name %in% x}, .collate = "cols") %>%
    pull(.out)
}
myFunction(temp, "Matt")
Run Code Online (Sandbox Code Playgroud)

by_row将布尔值添加为列。pull将列作为向量返回。

更新by_row功能已从purrr


Gue*_*sBF 5

还有其他非常一致且更通用的 dplyr 或 purrr 方法,因此您可以避免与 中 的矩阵转换相关的类强制apply()、for 循环的低效和冗长代码或来自提案的其他限制带来的问题rowSums

\n

使用 purrr\xe2\x80\x99s 映射、reduce 和 stringr\xe2\x80\x99s str_detect:

\n
library(purrr)\nlibrary(stringr)\n\ntemp%>%map(~str_detect(.x,'Matt'))%>%reduce(`|`)\n
Run Code Online (Sandbox Code Playgroud)\n

对于 dplyr,使用map%>%reducepmap%>%any或:rowwise%>%anyif_any

\n
library(purrr)\nlibrary(dplyr)\nlibrary(stringr)\n\ntemp%>%mutate(has_Matt=map(., ~str_detect(.x, 'Matt'))%>%pmap_lgl(any))\n\n#OR\n\ntemp%>%rowwise()%>%\n        mutate(has_Matt=any(str_detect(c_across(everything()), "Matt")))\n
Run Code Online (Sandbox Code Playgroud)\n

最简洁的,用 dplyr::if_any:

\n
temp%>%mutate(has_Matt=if_any(everything(), ~.x=="Matt"))\n
Run Code Online (Sandbox Code Playgroud)\n

如果您想定义一个新函数来简化此操作,您可以使用基 R 创建一个函数:

\n
my_function<-function(dataframe, pattern){\n        Reduce(`|`, Map(function(x) grepl('Matt', x), dataframe))\n}\n\nmy_function(temp, "Matt")\n\n[1]  TRUE  TRUE FALSE  TRUE FALSE\n
Run Code Online (Sandbox Code Playgroud)\n