Заполните значения NA соответствующим текстом из других наблюдений - PullRequest
1 голос
/ 29 апреля 2020

У меня есть некоторые данные, которые я пытаюсь заполнить.

Похоже:

                      CO_1_Name Ticker2LP
 1:                  Sonic Corp      SONC
 2:                  Sonic Corp      <NA>
 3:    Baxter International Inc      <NA>
 4:    Baxter International Inc       BAX
 5: Lockheed Martin Corporation       LMT

Есть некоторые пропущенные значения. Я хочу заполнить эти пропущенные значения идентификатором Ticker2LP, где он находится в других строках. Ожидаемый результат будет:

                      CO_1_Name Ticker2LP
 1:                  Sonic Corp      SONC
 2:                  Sonic Corp      SONC   # since the observation above has "SONC"
 3:    Baxter International Inc      BAX    # since the observation below has "BAX"
 4:    Baxter International Inc       BAX
 5: Lockheed Martin Corporation       LMT

Поэтому я хочу заполнить NA s in Ticker2LP when the names match from the column CO_1_Name`. «SON C» и «BAX» были заполнены, поскольку их имена были найдены в других строках.

Данные:

structure(list(CO_1_Name = c("Sonic Corp", "Sonic Corp", "Baxter International Inc", 
"Baxter International Inc", "Lockheed Martin Corporation", "Lockheed Martin Corporation", 
"Lockheed Martin Corporation", "Baxter International Inc", "Baxter International Inc", 
"Lockheed Martin Corporation", "Sonic Corp", "Sonic Corp", "Baxter International Inc", 
"Baxter International Inc", "Baxter International Inc", "Lockheed Martin Corporation", 
"Lockheed Martin Corporation", "Lockheed Martin Corporation", 
"Baxter International Inc", "Sonic Corp", "Lockheed Martin Corporation", 
"Lockheed Martin Corporation", "Lockheed Martin Corporation", 
"Lockheed Martin Corporation", "Baxter International Inc", "Sonic Corp", 
"Baxter International Inc", "Lockheed Martin Corporation", "Sonic Corp", 
"Lockheed Martin Corporation", "Lockheed Martin Corporation", 
"Baxter International Inc", "Baxter International Inc", "Baxter International Inc", 
"Lockheed Martin Corporation", "Baxter International Inc", "Baxter International Inc", 
"Baxter International Inc", "Baxter International Inc", "Baxter International Inc", 
"Baxter International Inc", "Baxter International Inc", "Baxter International Inc", 
"Baxter International Inc", "Baxter International Inc", "Lockheed Martin Corporation", 
"Sonic Corp", "Lockheed Martin Corporation", "Lockheed Martin Corporation", 
"Lockheed Martin Corporation", "Lockheed Martin Corporation", 
"Lockheed Martin Corporation", "Baxter International Inc", "Baxter International Inc", 
"Lockheed Martin Corporation", "Baxter International Inc", "Lockheed Martin Corporation", 
"Baxter International Inc", "Baxter International Inc", "Baxter International Inc"
), Ticker2LP = c("SONC", NA, NA, "BAX", "LMT", "LMT", "MLM", 
"AP", "BAX", "LMT", "SONC", "SONC", "BAX", "BAX", NA, "LMT", 
"LMT", "LMT", NA, NA, "LMT", NA, "NOC", NA, "BAX", NA, NA, "LMT", 
"SONC", NA, "LMT", NA, NA, "BAX", "NOC", "BAX", NA, NA, NA, "BAX", 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA)), .internal.selfref = <pointer: 0x55603dbefe00>, row.names = c(NA, 
-60L), class = c("data.table", "data.frame"))

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Использование filter

library(dplyr)
data %>% 
    filter(complete.cases(Ticker2LP)) %>% 
    distinct
#                     CO_1_Name Ticker2LP
#1:                  Sonic Corp      SONC
#2:    Baxter International Inc       BAX
#3: Lockheed Martin Corporation       LMT
#4: Lockheed Martin Corporation       MLM
#5:    Baxter International Inc        AP
#6: Lockheed Martin Corporation       NOC
1 голос
/ 29 апреля 2020

Как вы, возможно, знаете, ваши данные выборки имеют неуникальные комбинации CO_1_Name и Ticker2LP.

library(data.table)
unique(data[!is.na(Ticker2LP),])
                     CO_1_Name Ticker2LP
1:                  Sonic Corp      SONC
2:    Baxter International Inc       BAX
3: Lockheed Martin Corporation       LMT
4: Lockheed Martin Corporation       MLM
5:    Baxter International Inc        AP
6: Lockheed Martin Corporation       NOC

Звучит так, будто вы хотите реализовать какую-то форму "заполните значение из что-то рядом ". Один из подходов состоит в том, чтобы установить столбец ID и выполнить скользящее соединение.

setDT(data)[,id := 1:.N]
data[!is.na(Ticker2LP),][data , on = c("CO_1_Name","id"), roll = "nearest"][,.(CO_1_Name,Ticker2LP)]
                     CO_1_Name Ticker2LP
 1:                  Sonic Corp      SONC
 2:                  Sonic Corp      SONC
 3:    Baxter International Inc       BAX
 4:    Baxter International Inc       BAX
 5: Lockheed Martin Corporation       LMT
 6: Lockheed Martin Corporation       LMT
 7: Lockheed Martin Corporation       MLM
 8:    Baxter International Inc        AP
 9:    Baxter International Inc       BAX
10: Lockheed Martin Corporation       LMT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...