如何按room_type分组对listing_df的NA值进行随机抽样填充及循环实现
你的代码没有实现按room_type分组的随机填充,问题出在两点:
- dplyr的
group_by()只是给数据标记分组,直接用$引用列会自动取消分组,相当于在整个数据集上操作; - 你抽样的数据源是整个
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
相关产品推荐
相关产品推荐

