R语言:如何利用df2每行的字母组合筛选df1的目标列?
解决方法
你现有代码的核心问题是用错了函数:filter()是用来筛选行的,但你需要的是筛选满足两行都为0的列,而且letter_1和letter_2是df1的行索引,不是df1的列名,所以filter()找不到对应列,自然会报错或返回空值。
下面是可批量处理的完整实现方案:
1. 构造示例测试数据
# 模拟你的df1:行索引为a/b/c,列是字符串,单元格为数值 df1 <- data.frame( abaca = c(0, 1, 0), aaa = c(0, 0, 1), cc = c(0, 0, 0), row.names = c("a", "b", "c") ) # 模拟你的df2:每行是a/b/c的两两组合 df2 <- data.frame( V1 = c("a", "a", "b"), V2 = c("b", "c", "c") )
2. 编写核心处理函数
这个函数接收两个行名,返回df1中这两行值均为0的列名:
get_zero_cols <- function(row_name1, row_name2) { # 提取df1中指定的两行数据 target_rows <- df1[c(row_name1, row_name2), ] # 筛选出两行都为0的列:统计每列等于0的次数,等于2则说明两行都是0 zero_columns <- colnames(target_rows)[colSums(target_rows == 0) == 2] # 处理无匹配列的情况,返回NA;若有多个列则用逗号拼接成字符串 if (length(zero_columns) == 0) { return(NA_character_) } else { return(paste(zero_columns, collapse = ", ")) } }
3. 批量处理df2的所有行
方法一:用base R的apply
# 给df2新增一列存储结果 df2$result <- apply(df2, 1, function(row) get_zero_cols(row[1], row[2]))
方法二:用dplyr的rowwise(适合tidyverse用户)
library(dplyr) df2 <- df2 %>% rowwise() %>% mutate(result = get_zero_cols(V1, V2)) %>% ungroup()
最终结果示例
运行后df2会输出:
V1 V2 result 1 a b aaa 2 a c abaca 3 b c cc
内容的提问来源于stack exchange,提问作者jst
相关产品推荐
相关产品推荐

