我试图创建一个函数,为每一行识别指定字符串出现的列名。
例如,在这个数据集中,想象我从第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()
(如 此处). 我也试过 dplyr:contains()
喜欢 此处 但不知道如何让它在行上迭代。求助于我?
你可以这样做。
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