如何基于条件提取列名生成新列,完成LIWC词汇所属类别汇总
R语言实现LIWC类别列拼接方案
方案1:tidyverse 框架实现
适合已经在使用tidyverse生态处理数据的场景:
library(dplyr) df <- df %>% rowwise() %>% mutate( Categories = paste( names(select(., 2:75))[which(c_across(2:75) == 1)], collapse = "," ) ) %>% ungroup() # 取消行分组避免后续操作出错
逻辑说明:按行遍历数据,选中第2到75列的当前行值,筛选出取值为1的位置对应的列名,用逗号拼接后赋值给新列。
方案2:base R 实现(无需加载第三方包)
适合不想依赖额外包的轻量场景:
df$Categories <- apply(df[, 2:75], MARGIN = 1, function(row_val) { paste(names(row_val)[row_val == 1], collapse = ",") })
逻辑说明:通过apply函数按行遍历第2到75列,每行筛选取值为1的列名完成拼接。
补充说明
- 如果存在词汇不属于任何LIWC类别,默认拼接结果会返回空字符串,你可以按需调整逻辑,比如替换为
NA:# 以base R方案为例调整判断逻辑 df$Categories <- apply(df[, 2:75], MARGIN = 1, function(row_val) { matched_cols <- names(row_val)[row_val == 1] ifelse(length(matched_cols) == 0, NA_character_, paste(matched_cols, collapse = ",")) }) - 若你的类别列索引不是固定2到75,也可以把
2:75替换为starts_with("类别列统一前缀")等dplyr选择器适配你的数据结构。
内容的提问来源于stack exchange,提问作者user17143533
相关产品推荐
相关产品推荐

