R语言:计算实际值与多列预测值的列间不匹配次数之和
解决R中统计实际值与多列预测值不匹配次数的问题
嗨,作为R新手遇到这类问题完全正常,我们一步步来搞定它!首先,先确认你的数据结构,我先把你给出的数据框重现出来方便测试:
df <- data.frame( actual = c("a", "a", "b", "b", "a", "c", "c", "d"), predicted.1 = c("a", "a", "b", "b", "b", "c", "c", "c"), predicted.2 = c("a", "a", "b", "a", "b", "c", "d", "d"), predicted.3 = c("a", "b", "a", "b", "c", "c", "d", "d"), predicted.4 = c("a", "b", "b", "b", "c", "d", "d", "a"), stringsAsFactors = FALSE )
你的需求是统计每一列预测值与实际值的不匹配次数,预期结果c(2,1,2,4),这个需求其实可以用**colSums()**高效实现,这是处理这类列级求和最简洁的方式。
正确的实现代码
# 提取所有预测列(排除第一列的actual) prediction_columns <- df[, -1] # 计算每列与actual的不匹配次数 discordant_sums <- colSums(prediction_columns != df$actual) # 查看结果 discordant_sums
运行这段代码后,你会得到和预期完全一致的输出:
predicted.1 predicted.2 predicted.3 predicted.4 2 1 2 4
代码解释
prediction_columns != df$actual:R会自动做广播匹配,把df$actual这个向量和预测列的每一列逐一比较,生成一个8行4列的逻辑矩阵,其中TRUE表示不匹配,FALSE表示匹配。colSums():对这个逻辑矩阵的每一列求和(R中TRUE等价于1,FALSE等价于0),直接得到每列的不匹配次数。
你之前代码的问题
你写的discordant_sums(df[,seq(1,ncol(df),2)]!=,df[,seq(2,ncol(df),2)])有两个明显问题:
- 语法错误:
!=后面多了个逗号,导致代码无法运行; - 列选择错误:
seq(1,ncol(df),2)会选取第1、3、5列,这并不是实际值和对应预测值的正确配对(实际值只有第1列,预测值是第2-5列)。
另一种可选方法(用apply())
如果你想用apply()来实现,代码也很直观,不过效率上colSums()会更高一些:
discordant_sums <- apply(prediction_columns, 2, function(col) { sum(col != df$actual) })
希望这个解决方案能帮你顺利推进项目!
内容的提问来源于stack exchange,提问作者Kevin E Dow
相关产品推荐
相关产品推荐

