求助:遍历数据框计算NA占比并存储结果的R语言问题
解决方案
问题根源
- 你用字符向量
c("df1","df2","df3")存储数据框名称,遍历的时候操作的是字符串而非实际的dataframe对象,所以is.na(x)判断的是字符串里有没有NA(显然没有),nrow(x)对字符串也无效,导致返回numeric(0)。 - NA占比公式错误:总元素数应该是
行数量 × 列数量,也就是nrow(df)*ncol(df),你写成了nrow(df)*nrow(df),这会导致占比计算错误。
修正后的代码
1. 先修正数据框的存储方式(用列表存实际对象)
# Sample Data(原数据部分不变) counts1<-c(NA, 1,1,1,1,1,5,NA,NA,2, 3, 4, 3,3,2,NA) counts2<-c(NA,NA,NA,NA,NA,NA,2,4,2,4, NA,5,2,3,NA,NA) counts3<-c(5,5,1,3,NA,2,NA,NA,NA,NA, 4,3,2,1,1,NA) head1<-c("Steve", "Charlie", "Kam", "Tom") head2<-c("Chris", "Ellie", "Ben", "Louis") head3<-c("Paul", "Tammy", "Sheila", "Sara") df1<-matrix(counts1, nrow=4, ncol=4, byrow=TRUE) df2<-matrix(counts2, nrow=4, ncol=4, byrow=TRUE) df3<-matrix(counts3, nrow=4, ncol=4, byrow=TRUE) colnames(df1)<-head1 rownames(df1)<-head1 colnames(df2)<-head2 rownames(df2)<-head2 colnames(df3)<-head3 rownames(df3)<-head3 df1<-as.data.frame(df1) df2<-as.data.frame(df2) df3<-as.data.frame(df3) # 改用列表存储实际的dataframe对象,同时保留名称 dataframes <- list(df1 = df1, df2 = df2, df3 = df3)
2. 计算每个数据框的NA占比并整理结果
用lapply批量计算,再转成目标dataframe:
# 计算NA占比 na_percent_list <- lapply(dataframes, function(df) { total_elements <- nrow(df) * ncol(df) na_count <- sum(is.na(df)) na_count / total_elements }) # 转成目标dataframe na_percents <- data.frame( dfs = names(na_percent_list), percents = unlist(na_percent_list) ) # 查看结果 print(na_percents)
运行后会得到:
dfs percents 1 df1 0.3125 2 df2 0.5625 3 df3 0.3750
3. 统计NA占比≥50%的数据框数量
high_na_count <- sum(na_percents$percents >= 0.5) cat("NA占比达到50%及以上的数据框数量:", high_na_count, "\n")
输出:NA占比达到50%及以上的数据框数量: 1
额外说明
如果坚持要用字符向量存储名称,也可以用get(x)获取实际对象,但列表的方式更安全直观:
dataframes <- c("df1","df2","df3") na_percent_list <- lapply(dataframes, function(x) { df <- get(x) sum(is.na(df)) / (nrow(df)*ncol(df)) }) na_percents <- data.frame(dfs = dataframes, percents = unlist(na_percent_list))
内容的提问来源于stack exchange,提问作者poppiytt
相关产品推荐
相关产品推荐

