RStudio中修正Category列错位价格数据的方法求助
修复R语言数据集中的错位数据问题
针对你遇到的数据错位问题,可以通过以下步骤修复:
问题分析
你的数据集存在两类错位:
Category_alias列混入价格字符串,对应USD_Price为NACategory_alias为空,USD_Price有有效数据
我们需要把错位的价格移到USD_Price列,同时补全Category_alias的缺失值。
解决方案(tidyverse版本,适合新手)
先加载tidyverse包,然后分步骤处理:
# 加载包 library(tidyverse) # 导入你的数据(直接用你提供的dput结果) df <- structure(list(Category_alias = c("jewelry.pendant", "427.07", "jewelry.ring", "", "jewelry.earring", "53.62", "jewelry.ring", "jewelry.earring", "jewelry.brooch", "jewelry.earring", "jewelry.pendant", "jewelry.ring", "jewelry.ring", "jewelry.ring", "jewelry.earring", "jewelry.pendant"), USD_Price = c(589, NA, 495.21, 447.89, 804.79, NA, 509.59, 405.48, 352.05, 587.67, 158.7, 150.55, 214.48, 82.05, 280.68, 212.19)), row.names = 5350:5365, class = "data.frame") # 1. 把空字符串转为NA,方便后续处理 df_cleaned <- df %>% mutate(Category_alias = na_if(Category_alias, "")) # 2. 识别并修复价格错位的行 df_cleaned <- df_cleaned %>% mutate( # 判断哪些行的Category_alias是价格且USD_Price为空 is_price = !is.na(as.numeric(Category_alias)) & is.na(USD_Price), # 把价格移到USD_Price列 USD_Price = ifelse(is_price, as.numeric(Category_alias), USD_Price), # 把这些行的Category_alias设为NA,后续补全 Category_alias = ifelse(is_price, NA, Category_alias) ) %>% select(-is_price) # 删除临时判断列 # 3. 补全Category_alias的缺失值 # 先向下填充(处理空行的类别),再向上填充(处理价格行的类别) df_cleaned <- df_cleaned %>% fill(Category_alias, .direction = "down") %>% fill(Category_alias, .direction = "up") # 查看修复后的结果 print(df_cleaned)
解决方案(base R版本,无需额外包)
如果你不想加载第三方包,可以用base R实现:
# 导入你的数据 df <- structure(list(Category_alias = c("jewelry.pendant", "427.07", "jewelry.ring", "", "jewelry.earring", "53.62", "jewelry.ring", "jewelry.earring", "jewelry.brooch", "jewelry.earring", "jewelry.pendant", "jewelry.ring", "jewelry.ring", "jewelry.ring", "jewelry.earring", "jewelry.pendant"), USD_Price = c(589, NA, 495.21, 447.89, 804.79, NA, 509.59, 405.48, 352.05, 587.67, 158.7, 150.55, 214.48, 82.05, 280.68, 212.19)), row.names = 5350:5365, class = "data.frame") # 1. 把空字符串转为NA df$Category_alias[df$Category_alias == ""] <- NA # 2. 识别价格错位的行 price_rows <- !is.na(as.numeric(df$Category_alias)) & is.na(df$USD_Price) # 3. 把价格移到USD_Price列 df$USD_Price[price_rows] <- as.numeric(df$Category_alias[price_rows]) # 清空这些行的Category_alias df$Category_alias[price_rows] <- NA # 4. 向下填充Category_alias(处理空行) for(i in 2:nrow(df)){ if(is.na(df$Category_alias[i])){ df$Category_alias[i] <- df$Category_alias[i-1] } } # 5. 向上填充Category_alias(处理价格行) for(i in nrow(df):2){ if(is.na(df$Category_alias[i-1])){ df$Category_alias[i-1] <- df$Category_alias[i] } } # 查看结果 print(df)
修复后效果
处理后的数据会符合预期:
- 原5351行的
427.07会移到USD_Price,Category_alias补为jewelry.ring - 原5353行的
Category_alias补为jewelry.ring,保留USD_Price的447.89 - 原5355行的
53.62移到USD_Price,Category_alias补为jewelry.ring
内容的提问来源于stack exchange,提问作者Cassidy Peng
相关产品推荐
相关产品推荐

