Заменить значения значением из другого кадра данных - PullRequest
0 голосов
/ 15 марта 2019

У меня есть набор данных по всем продажам за 2018 год, и я пытаюсь провести анализ Парето.Предполагается, что данные имеют категорию продукта, и большинство из них имеют, но 1/5 нет.Теперь я хочу заполнить эти значения NA категорией продукта из другого блока данных, но мне это не удается.

Упрощенный пример ниже:

df1 <- data.frame(ID = c("1000", "1000", "1000", "1000", "1010", "1020", "1030", "1030", "1000"),
                  name = c("A", "B", "C", "D", "A", "A", "B", "F", "G"),
                  group_ID = c(NA, NA, NA, NA, NA, NA, NA, NA, NA), stringsAsFactors = FALSE)

df2 <- data.frame(IDx = c("1000", "1000", "1000", "1000", "1000", "1000", "1000", "1000", "1000"),
                  group_ID = c("blankets", "blankets", "blankets", "blankets", "blankets", "blankets", "blankets", "blankets", "blankets"),
                  stringsAsFactors = FALSE)

df1[is.na(df1)] <- "None"

df1 %>% 
  left_join(df2, by = c("ID" = "IDx")) %>% 
  mutate(group_ID = coalesce(group_ID.y, group_ID.x)) %>% 
  select(-group_ID.x, -group_ID.y)

Результатом этого кода является следующий кадр данных:

     ID name group_ID
1  1000    A blankets
2  1000    A blankets
3  1000    A blankets
4  1000    A blankets
5  1000    A blankets
6  1000    A blankets
7  1000    A blankets
8  1000    A blankets
9  1000    A blankets
10 1000    B blankets
11 1000    B blankets
12 1000    B blankets
13 1000    B blankets
14 1000    B blankets
15 1000    B blankets
16 1000    B blankets
17 1000    B blankets
18 1000    B blankets
19 1000    C blankets
20 1000    C blankets
21 1000    C blankets
22 1000    C blankets
23 1000    C blankets
24 1000    C blankets
25 1000    C blankets
26 1000    C blankets
27 1000    C blankets
28 1000    D blankets
29 1000    D blankets
30 1000    D blankets
31 1000    D blankets
32 1000    D blankets
33 1000    D blankets
34 1000    D blankets
35 1000    D blankets
36 1000    D blankets
37 1010    A     None
38 1020    A     None
39 1030    B     None
40 1030    F     None
41 1000    G blankets
42 1000    G blankets
43 1000    G blankets
44 1000    G blankets
45 1000    G blankets
46 1000    G blankets
47 1000    G blankets
48 1000    G blankets
49 1000    G blankets

Я не хочу этого.Я хочу что-то вроде:

    ID name group_ID
1 1000    A blankets
2 1000    B blankets
3 1000    C blankets
4 1000    D blankets
5 1010    A     None
6 1020    A     None
7 1030    B     None
8 1030    F     None
9 1000    G blankets

Я попробовал несколько соединений и посмотрел в Интернете, но не могу решить мою проблему.

Надеюсь, вы можете помочь!

Ответы [ 3 ]

0 голосов
/ 15 марта 2019

data.table solution

пример данных

df1 <- data.frame(ID = c("1000", "1000", "1000", "1000", "1010", "1020", "1030", "1030", "1000"),
name = c("A", "B", "C", "D", "A", "A", "B", "F", "G"), stringsAsFactors = FALSE)

Я пропустил столбец group_id ... вы создадите его с помощью объединения.

df2 <- data.frame(IDx = c("1000", "1000", "1000", "1000", "1000", "1000", "1000", "1000", "1000"),
                  group_ID = c("blankets", "blankets", "blankets", "blankets", "blankets", "blankets", "blankets", "blankets", "blankets"),
                  stringsAsFactors = FALSE)

код

library(data.table)
setDT(df1)[setDT(df2), group_ID := i.group_ID, on = .(ID = IDx)][]

Я использовал setDT() для создания data.tables из data.frames df1 и df2.Остальное - «простое» левое соединение по ссылке.

output

#      ID name group_ID
# 1: 1000    A blankets
# 2: 1000    B blankets
# 3: 1000    C blankets
# 4: 1000    D blankets
# 5: 1010    A     <NA>
# 6: 1020    A     <NA>
# 7: 1030    B     <NA>
# 8: 1030    F     <NA>
# 9: 1000    G blankets
0 голосов
/ 15 марта 2019

Вы можете использовать distinct().Это полный код:

distinct(
     df1 %>% 
         left_join(df2, by = c("ID" = "IDx")) %>% 
         mutate(group_ID = coalesce(group_ID.y, group_ID.x)) %>% 
         select(-group_ID.x, -group_ID.y))
0 голосов
/ 15 марта 2019

Я думаю unique(df1) возможно работает.

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