/ / दो डेटाफ्रेम में शामिल होना जहां एक तिथि किसी दूसरे में अंतराल में पड़ती है। आर - आर, फॉर-लूप, डेटाटेबल, लुब्र्रिडेट

दो डेटाफ्रेम में शामिल होना जहां एक तिथि किसी दूसरे में अंतराल में पड़ती है। आर - आर, फॉर-लूप, डेटाटेबल, लुब्र्रिडेट

मैं एक डेटाफ्रेम को दूसरे से मूल्यों के साथ भरने की कोशिश कर रहा हूं, इस पर आधारित है कि पहले की तारीख दूसरे में एक अंतराल में फिट बैठती है या नहीं।

अभी, मैं इसे लूप के लिए नेस्टेड के साथ कर रहा हूं, लेकिन कहने की जरूरत नहीं है, यह विधि दर्दनाक रूप से धीमी है।

यहां कुछ नमूना डेटा और लूप के लिए मेरा घोंसला है:

library(lubridate)

periods <- structure(list(week = structure(c(16475, 16489, 16531, 16545,16559, 16573, 16587, 16615, 16629, 16643, 16657, 16671, 16685,
16699, 16727, 16741, 16755, 16769, 16783, 16797, 16811, 16825
), class = "Date"), poll = c(6.5, 4, 12, 11.5, 13, 9.5, 7, 8,
4.5, 4.5, 7.5, 4.8, 6.33333333333333, 7.5, 11.125, 13, 12, 12.8571428571429,
10.5, 13, 11, 4)), .Names = c("week", "poll"), row.names = 82:103, class = "data.frame")

periods$week <- as.interval(ymd(period$week), ymd(period$week + weeks(2)))


weeks <- structure(list(week = structure(c(16720, 16622, 16776, 16720,
16734, 16741), class = "Date"), poll = c(NA, NA, NA, NA, NA,
13)), .Names = c("week", "poll"), row.names = c(NA, 6L), class = "data.frame")


for (i in seq_along(weeks$week)){
x <- weeks$week[i]
for (j in seq_along(periods$int)){
if (is.na(x)==T){next}
else if (x %within% periods$int[j]==T){weeks$poll <- periods[j,2]}
else {next}
}
}

मैं मान रहा हूं कि वहां एक लागू फ़ंक्शन है जो इसे तेज करेगा, लेकिन मैं इसे काम नहीं कर सकता ... सभी मदद के लिए धन्यवाद!

उत्तर:

जवाब के लिए 0 № 1

मैंने अपने मामले में काम करने वाले एक समाधान में सुधार किया, इसलिए अगर मैं किसी और को खुद को एक समान बांध में पाता हूं तो मैं इसे यहां पोस्ट करूंगा।

library(lubridate)
library(data.table)

periods <- structure(list(week = structure(c(16475, 16489, 16531, 16545,16559, 16573, 16587, 16615, 16629, 16643, 16657, 16671, 16685,
16699, 16727, 16741, 16755, 16769, 16783, 16797, 16811, 16825
), class = "Date"), poll = c(6.5, 4, 12, 11.5, 13, 9.5, 7, 8,
4.5, 4.5, 7.5, 4.8, 6.33333333333333, 7.5, 11.125, 13, 12, 12.8571428571429,
10.5, 13, 11, 4)), .Names = c("week", "poll"), row.names = 82:103, class = "data.frame")

periods$week2 <- ymd(periods$week + weeks(2))

structure(list(week = structure(c(16720, 16622, 16776, 16720,
16734, 16741), class = "Date"), poll = c(NA, NA, NA, NA, NA,
NA)), .Names = c("week", "poll"), row.names = c(NA, 6L), class = "data.frame")

week$week2 <- week$week

setDT(periods)
setDT(weeks)
setkey(periods, week, week2)
setkey(weeks, week, week2)

merged = foverlaps(periods, weeks, by.x=c("week", "week2"))

यह सुंदर नहीं है, लेकिन यह मेरे मामले के लिए काम करता है।