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)
因为马特出现在第一、第二和第四行。感谢您对此的任何简单帮助,谢谢!
这是一个选项。使用apply和匹配 ( %in%)。
apply(temp, 1, function(x) any(x %in% "Matt"))
[1] TRUE TRUE FALSE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
此解决方案使用dplyr和purrr。
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
还有其他非常一致且更通用的 dplyr 或 purrr 方法,因此您可以避免与 中 的矩阵转换相关的类强制apply()、for 循环的低效和冗长代码或来自提案的其他限制带来的问题rowSums。
使用 purrr\xe2\x80\x99s 映射、reduce 和 stringr\xe2\x80\x99s str_detect:
\nlibrary(purrr)\nlibrary(stringr)\n\ntemp%>%map(~str_detect(.x,'Matt'))%>%reduce(`|`)\nRun Code Online (Sandbox Code Playgroud)\n对于 dplyr,使用map%>%reduce、pmap%>%any或:rowwise%>%anyif_any
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")))\nRun Code Online (Sandbox Code Playgroud)\n最简洁的,用 dplyr::if_any:
\ntemp%>%mutate(has_Matt=if_any(everything(), ~.x=="Matt"))\nRun Code Online (Sandbox Code Playgroud)\n如果您想定义一个新函数来简化此操作,您可以使用基 R 创建一个函数:
\nmy_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\nRun Code Online (Sandbox Code Playgroud)\n