如何让R语言apply函数处理数据框时第三列始终返回1?
问题原因
当你用apply(df, 2, ...)处理包含字符列的数据框时,apply会自动把整个数据框转换成字符型矩阵——因为矩阵要求所有元素类型统一,字符列的存在会让所有列被迫转成字符格式。这时候第三列的数值1会变成字符串"1",执行x == 1时,字符串和数值的比较结果全是FALSE,最终sum返回0。而只选取数值列时,矩阵是数值型,比较逻辑正常,所以第三列能正确统计出1个1。
解决方法
以下几种方法都能实现不管数据框是否包含字符列,第三列都返回正确结果:
方法1:自动筛选数值列后再用apply
先通过sapply(df, is.numeric)自动识别所有数值型列,再传入apply处理,不用手动指定列索引:
apply(df[, sapply(df, is.numeric)], 2, function(x) sum(x == 1 & !is.na(x)))
方法2:用tidyverse工具直观处理
如果你习惯使用dplyr,可以用across配合where(is.numeric),只对数值列执行统计逻辑:
library(dplyr) df %>% summarise(across(where(is.numeric), ~sum(.x == 1 & !is.na(.x))))
方法3:在apply函数内转换数据类型
直接在自定义函数里把列转换成数值型再做比较,这样即使列被转成字符,也能还原成数值判断(字符列转数值会变成NA,sum时会被忽略,最终返回0,不影响数值列的结果):
apply(df, 2, function(x) sum(as.numeric(x) == 1 & !is.na(as.numeric(x))))
内容的提问来源于stack exchange,提问作者etulf
相关产品推荐
相关产品推荐

