在R中当数据框行包含指定字符串时输出对应列名
问题描述
现有数据集如下:
A B C D 1! 0! 1! 0! 0! . 1! 1!
需要输出如下格式的结果:将每行中值为1!的列名合并为逗号分隔的字符串存入matches_1列,值为0!的列名存入matches_0列:
matches_1 matches_0 A,C B,D C,D A
目前仅能通过以下代码统计每行中1!的出现次数,不知道如何将计数替换为对应的列名:
df$matches_1 <- colSums(apply(df, 1, stringr::str_count, "1!"))
解决方案
可以通过逐行筛选符合条件的列名并合并的方式实现,以下是两种可行的R代码实现方式:
基础R写法
# 先构造示例数据框 df <- data.frame( A = c("1!", "0!"), B = c("0!", "."), C = c("1!", "1!"), D = c("0!", "1!"), stringsAsFactors = FALSE ) # 生成matches_1:提取每行值为"1!"的列名,合并为逗号分隔字符串 df$matches_1 <- apply(df, 1, function(x) { paste(names(df)[x == "1!"], collapse = ",") }) # 生成matches_0:提取每行值为"0!"的列名,合并为逗号分隔字符串 df$matches_0 <- apply(df, 1, function(x) { paste(names(df)[x == "0!"], collapse = ",") }) # 提取目标结果列 result <- df[, c("matches_1", "matches_0")] print(result)
运行后输出结果:
matches_1 matches_0 1 A,C B,D 2 C,D A
tidyverse风格写法
如果习惯使用dplyr+purrr的tidy语法,可参考以下代码:
library(dplyr) library(purrr) result <- df %>% mutate( matches_1 = pmap_chr(., ~ paste(names(df)[c(...) == "1!"], collapse = ",")), matches_0 = pmap_chr(., ~ paste(names(df)[c(...) == "0!"], collapse = ",")) ) %>% select(matches_1, matches_0)
代码说明
apply(df, 1, ...)或pmap_chr用于按行遍历数据框x == "1!"生成逻辑向量,标记该行中值为1!的列位置names(df)[逻辑向量]筛选出对应位置的列名paste(..., collapse = ",")将筛选出的列名合并为逗号分隔的字符串
内容的提问来源于stack exchange,提问作者Gabriel G.
相关产品推荐
相关产品推荐

