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

如何按room_type分组对listing_df的NA值进行随机抽样填充及循环实现

你的代码没有实现按room_type分组的随机填充,问题出在两点:

  1. dplyr的group_by()只是给数据标记分组,直接用$引用列会自动取消分组,相当于在整个数据集上操作;
  2. 你抽样的数据源是整个listings_df的列,不是当前分组下的非NA值,填充的是全局随机值,而非对应组内的随机值。

下面给你两种可行的解决方案:

一、用dplyr分组实现(推荐)

先定义一个通用的缺失值随机填充函数,再结合group_by()和mutate()完成组内填充:

# 定义函数:用向量自身的非NA值随机填充NA
fill_na_random <- function(x) {
  na_pos <- is.na(x)
  if (!any(na_pos)) return(x)
  # 可根据需求调整replace=TRUE/FALSE,TRUE允许重复抽样
  x[na_pos] <- sample(x[!na_pos], size = sum(na_pos), replace = TRUE)
  x
}

# 分组填充目标列
filled_df <- listings_df %>%
  group_by(room_type) %>%
  mutate(
    number_of_reviews = fill_na_random(number_of_reviews),
    review_scores_rating = fill_na_random(review_scores_rating)
  ) %>%
  ungroup() # 取消分组,恢复普通DataFrame

如果要批量处理多列,用across()更高效:

filled_df <- listings_df %>%
  group_by(room_type) %>%
  mutate(across(c(number_of_reviews, review_scores_rating), fill_na_random)) %>%
  ungroup()

二、用循环实现

如果偏好循环写法,思路是逐个遍历每个room_type,再处理每个目标列的缺失值:

# 复制原数据,避免修改原始数据集
filled_df <- listings_df

# 获取所有唯一的房型类别
unique_rooms <- unique(filled_df$room_type)

# 要处理的目标列
target_cols <- c("number_of_reviews", "review_scores_rating")

# 循环每个房型
for (room in unique_rooms) {
  # 循环每个目标列
  for (col in target_cols) {
    # 定位当前房型的行
    group_rows <- filled_df$room_type == room
    # 定位当前房型下该列的NA位置
    na_rows <- group_rows & is.na(filled_df[[col]])
    
    if (sum(na_rows) > 0) {
      # 从当前房型的非NA值中抽样填充
      filled_df[[col]][na_rows] <- sample(
        filled_df[[col]][group_rows & !is.na(filled_df[[col]])],
        size = sum(na_rows),
        replace = TRUE
      )
    }
  }
}

内容的提问来源于stack exchange,提问作者ComputingVictor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:01:08