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

时间:2017-08-22 21:34:36

标签: 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")

大家好,

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

  name1 name2 name3
1  Mike  Nick  Matt
2   Joe  Matt   Tom
3  Mike  Nick   Tom
4   Joe  Matt Steve
5  Mike  Nick   Tom

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

myfunction(Matt) 

# should return
c(TRUE, TRUE, FALSE, TRUE, FALSE).

因为Matt出现在第1行,第2行和第4行。感谢任何简单的帮助,谢谢!

4 个答案:

答案 0 :(得分:4)

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

rowSums("Matt" == temp) > 0 

似乎可以解决这个问题

答案 1 :(得分:4)

此解决方案使用dplyrpurrr

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

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

答案 2 :(得分:2)

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

apply(temp, 1, function(x) any(x %in% "Matt")) 
[1]  TRUE  TRUE FALSE  TRUE FALSE

答案 3 :(得分:0)

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

rowSums

我偶尔会发现 library(purrr) library(stringr) temp%>%map(., ~str_detect(., 'Matt'))%>%reduce(., `|`) 变体和 pmap_*anyall 对这些类型的逻辑行操作更直观

reduce

使用 dplyr(按列):

temp%>%map(., ~str_detect(., 'Matt'))%>%pmap_lgl(., any)

使用 dplyr(rowwise):

temp%>%mutate(has_Matt=map(., ~str_detect(., 'Matt'))%>%pmap_lgl(., any))