2014-12-02 4 views
0

Я пытаюсь выбрать информацию из одного data.frame для импорта в столбцы другого. Выбранные значения могут быть идентифицированы по строке и столбцу и зависят от вычислений из существующих столбцов выходных данных. Я застрял, потому что есть множество шагов, чтобы объединиться, и, несмотря на то, что он сломал его и получил детали для работы, я не могу собрать финальную комбинацию.Поиск значений из одного data.frame для создания столбца в другом, используя даты в текущем data.frame

Мой взгляд вверх data.frame имеет вид:

Date.Time <- rep(c("2014/05/06_pm", "2014/05/07_am", "2014/05/07_pm", "2014/05/08_am"), 4) 
Nest <- c(rep("WTSN08", 4), rep("WTSN26", 4), rep("WTSN07", 4), rep("WTSN06", 4)) 
value <- c(25, 24, 26, 25, 27, 27, 28, 26, 21, 23, 21, 20, 25, 28, 26, 28) 
df <- data.frame(Date.Time, Nest, value) 
library(reshape) 
Lookup <- cast(df, Nest ~ Date.Time, row.names = FALSE) 

Мой выход data.frame имеет вид:

Nest <- rep(c("WTSN08","WTSN26","WTSN07","WTSN06"), 2) 
Hatch <- as.Date(rep(c("2014/04/28", "2014/04/29", "2014/04/29", "2014/04/25"),2)) 
Age <- c(9.5, 8.0, 8.5, 13.0, 10.0, 9.5, 9.5, 12.0) 
Output <- data.frame(Nest, Hatch, Age) 

Что мне нужно сделать, это создать новый столбец , Output$T-1, который добавляет Output$Age к дате, указанной в Output$Hatch, признав возраст, заканчивающийся на «.5», днем ​​и возвращает значение из Lookup, соответствующее временному интервалу, до того, как читать в Output, например:

Для WTSN08: 2014/04/28 + 9.5 = 2014/05/07_pm; поэтому возвращаемое значение для WTSN08 равно 2014/05/07_am = 24

Вторая колонка затем вычисляет одно и то же, но возвращает значение 2 временных интервала перед (например, 2014/05/06_pm для выше).

Я обнаружил, что

Output$Hatch + Output$Age 

будет выводить правильную дату, и что

paste(as.character(Output$Hatch + Output$Age), "am", sep = "_") 

будет добавлять «_am» на сегодняшний день, таким образом, что значение можно посмотреть вверх, таким образом,

Lookup[Lookup$Nest == "WTSN08",as.character(paste(as.character(Output$Hatch + Output$Age), "am", sep = "_"))] 

и что

grepl("^.+(.5)$",Output$Age) 

вернет расположение возрастов, оканчивающиеся на».5"

Я попытался обернуть это в IfElse команды, сначала просто получить значение для вычисленного временного интервала (а не беспокоиться о вычитая дни еще), чтобы сформировать столбец:

Output$T <- ifelse(grepl("^.+(.5)$",WTS_w$Age), 
    Max.Ts[Max.Ts$Nest == as.character(WTS_w$Nest), paste(as.character(WTS_w$Hatch + WTS_w$Age), "pm", sep = "_")], 
    Max.Ts[Max.Ts$Nest == as.character(WTS_w$Nest), paste(as.character(WTS_w$Hatch + WTS_w$Age), "am", sep = "_")] 
) 

или использование «соответствия» для поиска строки, но безрезультатно.

Может ли кто-нибудь помочь? Заранее спасибо!

ответ

0

Я думал, что может быть информативным, чтобы пользователи знали, что я решил это.

я в конечном итоге оставив Lookup data.frame в расплавленном виде, а именно:

df <- data.frame(Date.Time, Nest, value) 

Затем я использовал paste объединить Nest и Date.Time колонны

paste(df$Nest, df$Date.Time, sep = "_") 

так, чтобы они могли быть согласованы к данным Output.после того, как я уже достиг этого.

Сведя вместе с ifelse команды, завернутой в match дал значение в текущем временном интервале:

Output$T <- df$value[match(ifelse(grepl("^.+(.5)$",Output$Age), 
            paste(Output$Nest, as.character(Output$Hatch + Output$Age), "pm", sep = "_"), 
            paste(Output$Nest, as.character(Output$Hatch + Output$Age), "am", sep = "_")) 
            ,paste(df$Nest, df$Date.Time, sep = "_"))] 

Чтобы получить значение в предыдущем временном интервале, я настроил код:

Output$T1 <- df$value[match(ifelse(grepl("^.+(.5)$",Output$Age), 
            paste(Output$Nest, as.character(Output$Hatch + Output$Age), "am", sep = "_"), 
            paste(Output$Nest, as.character(Output$Hatch + Output$Age -1), "pm", sep = "_")) 
            ,paste(df$Nest, df$Date.Time, sep = "_"))] 
Смежные вопросы