用其他列中的给定信息替换R中缺少的值
假设我在R中有一个大数据框,列出了商品编号和品牌编号 每个品牌可以有多个项目编号,但项目编号只能有一个对应的品牌编号 是否有一种快速计算和替换缺失品牌条目(NA值)的方法,如下所示,将NA值保留在无法找到准确替换的位置用其他列中的给定信息替换R中缺少的值,r,R,假设我在R中有一个大数据框,列出了商品编号和品牌编号 每个品牌可以有多个项目编号,但项目编号只能有一个对应的品牌编号 是否有一种快速计算和替换缺失品牌条目(NA值)的方法,如下所示,将NA值保留在无法找到准确替换的位置 trainset <- data.frame("brand" = c(1,2,3,NA,NA,NA,2,NA,2,NA,NA,NA,NA,NA), "item" = c(50, 100, 300,200,100,100,100,50,200,300,100,50,200,9
trainset <- data.frame("brand" = c(1,2,3,NA,NA,NA,2,NA,2,NA,NA,NA,NA,NA), "item" = c(50, 100, 300,200,100,100,100,50,200,300,100,50,200,900)
trainset
trainsetresult <- <- data.frame("brand" = c(1, 2, 3, 2, 2, 2, 2, 1, 2, 3, 2, 1, 2, NA), "item" = c(50, 100, 300,200,100,100,100,50,200,300,100,50,200,900)
trainsetresult
trainset尝试以下操作。在创建一个只包含完整且唯一的行的数据框后,它使用match
获取该临时数据框中项
列的位置
tmp <- trainset[complete.cases(trainset), ]
tmp <- tmp[!duplicated(tmp), ]
i <- match(trainset$item, tmp$item)
trainset$brand <- tmp$brand[i]
最终清理
rm(tmp, i)
一种方法是使用联接,让我们尝试data.table
:
library(data.table)
setDT(trainset)
trainset[!is.na(brand),][trainset, on = "item", .(brand, item)]
输出:
brand item
1: 1 50
2: 2 100
3: 2 100
4: 3 300
5: 2 200
6: 2 100
7: 2 100
8: 2 100
9: 2 100
10: 2 100
11: 2 100
12: 1 50
13: 2 200
14: 3 300
15: 2 100
16: 2 100
17: 1 50
18: 2 200
19: NA 900
您还可以使用最小值
或最大值
作为替换,例如使用dplyr
:
library(dplyr)
trainset %>%
group_by(item) %>%
mutate(
brand = ifelse(all(is.na(brand)), NA, min(brand, na.rm = T))
)
另一种方法是将dplyr
与zoo
相结合,但我认为这有点过分了:
trainset %>%
group_by(item) %>%
arrange(brand) %>%
mutate(
brand = zoo::na.locf(brand, na.rm = FALSE)
)
trainset %>%
group_by(item) %>%
arrange(brand) %>%
mutate(
brand = zoo::na.locf(brand, na.rm = FALSE)
)