如何用Base-R逐行识别多列中值不同的列并写入结果列?
Base-R 快速实现逐行找出数值不同的列名
针对你的需求,用Base-R可以通过apply函数结合简单逻辑判断快速实现,无需额外依赖包。以下是具体代码和步骤:
首先是你的示例数据框:
df <- data.frame( colA = as.integer(c(1,-1,1,1,-1)), colB = as.integer(c(-1,1,1,-1,1)), colC = as.integer(c(1,1,1,-1,-1)), colD = as.integer(c(1,1,-1,-1,-1)) )
接下来逐行处理,找出每行中数值与其他列不同的列名:
# 给数据框新增results列 df$results <- apply(df, 1, function(row) { # 获取该行出现次数最多的数值(即其他列的共同值) common_val <- names(sort(table(row), decreasing = TRUE))[1] # 筛选出值不等于共同值的列名 names(row)[row != common_val] })
执行后查看结果,完全符合预期:
print(df) # colA colB colC colD results # 1 1 -1 1 1 colB # 2 -1 1 1 1 colA # 3 1 1 1 -1 colD # 4 1 -1 -1 -1 colA # 5 -1 1 -1 -1 colB
补充说明
- 这个方法默认每行只有一个列的数值与其他列不同(和你的示例场景匹配),如果存在多行有多个不同值的情况,
results列会返回包含多个列名的向量。 apply是Base-R的核心函数,处理中小规模数据时效率足够,无需额外安装扩展包。
内容的提问来源于stack exchange,提问作者Err
相关产品推荐
相关产品推荐

