我有一个包含多个字符串变量的数据框架。
library(tidyverse)
animals <- data.frame(
a = c("antilope", "giraffe", "zebra"),
b = c("giraffe", "zebra", NA),
c = c("zebra", NA, NA))
我想把它变成一个表,如果动物出现在行中的任何地方,则显示TRUE/FALSE。我希望颜色代表动物的类型。
unique_names <- c("antilope", "giraffe", "zebra")
colnames(animals) <- unique_names
因此,我的想法是让R进行逐行扫描,如果特定行的任何一个单元格与列名匹配,则写入TRUE。最终结果应该是:
data.frame(
antilope = c(TRUE, FALSE, FALSE),
giraffe = c(TRUE, TRUE, FALSE),
zebra = c(TRUE, TRUE, TRUE)
)
我已经成功地用一个模式做到了这一点,像这样:
animals %>%
rowwise() %>%
transmute(giraffe = any(str_detect(string= across(), pattern = "giraffe")))
我可以通过复制/粘贴来重复这一行,但这似乎不是一个非常程序化的方法。是否有可能以更普遍的方式做到这一点?
in Base R:
t(table(stack(animals)))>0
values
ind antilope giraffe zebra
a TRUE TRUE TRUE
b FALSE TRUE TRUE
c FALSE FALSE TRUE
如果你想要一个数据框架:
as.data.frame.matrix(t(table(stack(animals)))>0)
antilope giraffe zebra
a TRUE TRUE TRUE
b FALSE TRUE TRUE
c FALSE FALSE TRUE
如果你需要使用unique_name
向量:注意你得到一个矩阵,你可以转换为数据帧
Vectorize(grepl, 'pattern')(unique_names, animals)
antilope giraffe zebra
[1,] TRUE TRUE TRUE
[2,] FALSE TRUE TRUE
[3,] FALSE FALSE TRUE