Имам стотици хиляди редове, които най-многоот тях липсват стойности (колона 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)