You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:42:33