Замена отсутствующих значений в R заданной информацией в других столбцах - PullRequest
0 голосов
/ 29 декабря 2018

Допустим, у меня большой массив данных в 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

trainsetresult

Дополнительная информация: номера элементов, а также номера брендов превышают пару сотен в кадре данных, над которым я работаю.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Один способ будет с объединением, давайте попробуем 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

Вы также можете использовать minimum или maximum в качествезамена, например, на 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)
  )
0 голосов
/ 29 декабря 2018

Попробуйте следующее.После создания кадра данных с только полными и уникальными строками он использует match, чтобы получить позиции столбца item в этом временном кадре данных.

tmp <- trainset[complete.cases(trainset), ]
tmp <- tmp[!duplicated(tmp), ]

i <- match(trainset$item, tmp$item)
trainset$brand <- tmp$brand[i]

Проверьте, сработал ли он.

all.equal(trainset, trainsetresult)
#[1] TRUE

Финальная уборка.

rm(tmp, i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...