识别包含 R 中给定字符串的列
Identify the columns that contain a given string in R
我正在尝试创建一个函数,该函数为每一行标识出现指定字符串的列的名称。
例如,假设我在这个数据集中从第 1-3 行开始。我想创建一个新列 desired_column
,其中包含出现 "foo" 的行。
row1 <- c('a', 'b', 'c', 'foo')
row2 <- c('foo', 'a', 'foo', 'b')
row3<- c('b', 'foo', 'b', 'b')
desired_column <- c('row2', 'row3', 'row2', 'row1')
df <- data.frame(row1, row2, row3, desired_column)
row1 row2 row3 desired_column
1 a foo b row2
2 b a foo row3
3 c foo b row2
4 foo b b row1
我试过使用像 which(df == "foo", arr.ind = TRUE)
这样的函数(参见 ), but that doesn't seem to work, and with iterations of stringr::str_detect()
(e.g., ). I've also tried dplyr:contains()
like 但不知道如何让它遍历行。帮助?
你可以这样做:
df$desired_column <- names(df)[max.col(cbind(df, FALSE) == "foo", ties.method = "last")]
给出:
row1 row2 row3 desired_column
1 a foo b row2
2 b a foo row3
3 c foo b row2
4 foo b b row1
使用 cbind(df, FALSE)
确保在任何特定行中没有匹配项时返回 NA
。
针对您的评论,grepl()
可用于部分匹配或 agrepl()
用于模糊匹配:
row1 <- c('a', 'b', 'c', 'fool')
row2 <- c('foo', 'a', 'foo', 'b')
row3<- c('b', 'foo', 'b', 'b')
df <- data.frame(row1, row2, row3)
df$desired <- max.col(cbind(sapply(df, grepl, pattern = "foo"), FALSE), ties.method = "last")
给出:
row1 row2 row3 desired
1 a foo b row2
2 b a foo row3
3 c foo b row2
4 fool b b row1
我正在尝试创建一个函数,该函数为每一行标识出现指定字符串的列的名称。
例如,假设我在这个数据集中从第 1-3 行开始。我想创建一个新列 desired_column
,其中包含出现 "foo" 的行。
row1 <- c('a', 'b', 'c', 'foo')
row2 <- c('foo', 'a', 'foo', 'b')
row3<- c('b', 'foo', 'b', 'b')
desired_column <- c('row2', 'row3', 'row2', 'row1')
df <- data.frame(row1, row2, row3, desired_column)
row1 row2 row3 desired_column
1 a foo b row2
2 b a foo row3
3 c foo b row2
4 foo b b row1
我试过使用像 which(df == "foo", arr.ind = TRUE)
这样的函数(参见 stringr::str_detect()
(e.g., dplyr:contains()
like
你可以这样做:
df$desired_column <- names(df)[max.col(cbind(df, FALSE) == "foo", ties.method = "last")]
给出:
row1 row2 row3 desired_column
1 a foo b row2
2 b a foo row3
3 c foo b row2
4 foo b b row1
使用 cbind(df, FALSE)
确保在任何特定行中没有匹配项时返回 NA
。
针对您的评论,grepl()
可用于部分匹配或 agrepl()
用于模糊匹配:
row1 <- c('a', 'b', 'c', 'fool')
row2 <- c('foo', 'a', 'foo', 'b')
row3<- c('b', 'foo', 'b', 'b')
df <- data.frame(row1, row2, row3)
df$desired <- max.col(cbind(sapply(df, grepl, pattern = "foo"), FALSE), ties.method = "last")
给出:
row1 row2 row3 desired
1 a foo b row2
2 b a foo row3
3 c foo b row2
4 fool b b row1