用其他列中的给定信息替换R中缺少的值

用其他列中的给定信息替换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

假设我在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,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)
  )