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行。感谢任何简单的帮助,谢谢!
答案 0 :(得分:4)
我也提出了自己的解决方案:
rowSums("Matt" == temp) > 0
似乎可以解决这个问题
答案 1 :(得分:4)
此解决方案使用dplyr
和purrr
。
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_*
或
any
比 all
对这些类型的逻辑行操作更直观
reduce
使用 dplyr(按列):
temp%>%map(., ~str_detect(., 'Matt'))%>%pmap_lgl(., any)
使用 dplyr(rowwise):
temp%>%mutate(has_Matt=map(., ~str_detect(., 'Matt'))%>%pmap_lgl(., any))