You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:遍历数据框计算NA占比并存储结果的R语言问题

解决方案

问题根源

  1. 你用字符向量c("df1","df2","df3")存储数据框名称,遍历的时候操作的是字符串而非实际的dataframe对象,所以is.na(x)判断的是字符串里有没有NA(显然没有),nrow(x)对字符串也无效,导致返回numeric(0)。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:15:35