/ / Индексиране на не-празни стойности за уникална стойност в R - r

Индексиране на празни стойности за уникална стойност в R - r

Имам стотици хиляди редове, които най-многоот тях липсват стойности (колона 2). Въз основа на първичен ключ (колона 1) мога да предположа, че липсващите стойности могат да бъдат вменени със стойности, свързани с този ключ. Ще е необходим пример.

Primary Key Date       Date.Impute
123         ""
123         ""
123         02/02/2017
1234        ""
1234        02/03/2017
1234        ""
12345       01/01/2017
12345       ""

Всички поръчки "123" са "02/02/2017". Всички поръчки "1234" са "02/03/2017" и др.

Използвайки или не използвайки характеристика, подобна на индекс, в R, как мога да попълня всички липсващи полета на втората колона в третата колона? Крайният резултат трябва да харесва следното:

Primary Key Date          Date.Impute
123         ""            02/02/2017
123         ""            02/02/2017
123         02/02/2017    02/02/2017
1234        ""            02/03/2017
1234        02/03/2017    02/03/2017
1234        ""            02/03/2017
12345       01/01/2017    01/01/2017
12345       ""            01/01/2017

Знам как да направя това в Excel и с удоволствие ще го споделя, но бих искал да разбера как да го направя в R. Всяка помощ ще бъде много оценявам. Благодаря ти.

Отговори:

2 за отговор № 1

Възпроизводими данни

Добавих допълнителен ред с Primary.Key == 123456 няма един Date стойност

library(lubridate)
df <- data.frame(Primary.Key = c(123,123,123,1234,1234,1234,12345,12345,123456),
Date=mdy(NA,NA,"02/02/2017",NA,"02/03/2017",NA,"01/01/2017",NA,NA),
Date.Impute=as.Date(rep(NA,9)), stringsAsFactors=F)

dplyr и purrr разтвор

употреба ifelse да се справят с вписвания като Primary.Key == 123456 без един Date стойност. Аз също промених от употреба unique да се tail(sort(),1)

library(dplyr)
library(purrr)
L <- split(df, df$Primary.Key)           # split by Primary.Key groups into list
df1 <- map_df(L, ~.x %>% mutate(Date.Impute = ifelse(length(tail(sort(Date),1))==0, as.character(NA), as.character(tail(sort(Date),1)))))
df2 <- df1 %>% mutate(Date.Impute = ymd(Date.Impute))

продукция

  Primary.Key       Date Date.Impute
1         123       <NA>  2017-02-02
2         123       <NA>  2017-02-02
3         123 2017-02-02  2017-02-02
4        1234       <NA>  2017-02-03
5        1234 2017-02-03  2017-02-03
6        1234       <NA>  2017-02-03
7       12345 2017-01-01  2017-01-01
8       12345       <NA>  2017-01-01
9      123456       <NA>        <NA>

6 за отговор № 2

в база R можете просто да го направите

merge(df, unique(df[df$Date!="",]), by="Primary.Key", all.x = T)

#  Primary.Key     Date.x     Date.y
#1         123            02/02/2017
#2         123            02/02/2017
#3         123 02/02/2017 02/02/2017
#4        1234            02/03/2017
#5        1234 02/03/2017 02/03/2017
#6        1234            02/03/2017
#7       12345 01/01/2017 01/01/2017
#8       12345            01/01/2017

1 за отговор № 3

Това може да се окаже малко бавно ... но поне да работи с:

for (key in unique(df$Primary_Key)) {
keyrows <- df$Primary_Key == key
key_d <- df[keyrows & df$Date != "", "Date"][1]
df[keyrows, "Date.impute"] <- key_d
}

df

Primary_Key       Date Date.impute
1         123             02/02/2017
2         123             02/02/2017
3         123 02/02/2017  02/02/2017
4        1234             02/03/2017
5        1234 02/03/2017  02/03/2017
6        1234             02/03/2017
7       12345 01/01/2017  01/01/2017
8       12345             01/01/2017

Той се отнася до случая, когато има две дати за един първичен ключ, като просто изберете първата дата, която се появява.

Данни:

df <- data.frame(Primary_Key = c(rep(123L, 3), rep(1234L, 3), rep(12345L, 2)),
Date = c("", "", "02/02/2017", "", "02/03/2017", "",
"01/01/2017", ""),
Date.impute = "",
stringsAsFactors = FALSE)