R [डुप्लिकेट] में प्रत्येक पंक्ति के भीतर सबसे प्राचीन और नवीनतम तिथि ज्ञात करें
मेरे पास 400 से अधिक स्तंभों के साथ बड़ा डेटा सेट है जो एक ऑनलाइन प्लेटफ़ॉर्म से कुछ उपयोगकर्ता इनपुट तत्वों का प्रतिनिधित्व करता है और उस समय जब प्रत्येक इनपुट घटता है। प्रत्येक पंक्ति एक उपयोगकर्ता आईडी का प्रतिनिधित्व करती है।
उन स्तंभों में से 200 वर्ग "POSIXct" "POSIXt" (उदाहरण 2019-11-04 15:33:50) के हैं, और गायब मूल्य मान सकते हैं, क्योंकि प्रत्येक उपयोगकर्ता द्वारा प्रत्येक तत्व को प्रदर्शित या भरा नहीं जाता है।
मेरा लक्ष्य उन दो अतिरिक्त स्तंभों को बनाना है जिनमें उन 200 "पॉसिक्ट" "पोसिक्स" कॉलमों में से प्रत्येक की शुरुआती और नवीनतम तारीख शामिल है।
यहां फ्रेम का एक सरलीकृत उदाहरण और वांछित अतिरिक्त कॉलम में से एक है। (आईडी 4 ऐसा व्यक्ति होगा जिसने कभी भी साइड खोलने की जहमत नहीं उठाई, लेकिन उसके पास अन्य डेटा स्रोतों से डेटा उपलब्ध है, और अभी के लिए डेटासेट में रहना चाहिए)
ID Other_columns date_column date_column2 date_column3 max_date (what I want)
1 "numeric" 2019-11-04 19:33:50 2019-11-05 15:33:50 2019-11-05 16:33:50 2019-11-05 16:33:50
2 "numeric" NA 2019-11-04 17:20:10 2019-11-09 19:12:50 2019-11-09 19:12:50
3 "numeric" 2019-11-07 20:33:50 NA 2019-11-04 18:31:50 2019-11-07 20:33:50
4 NA NA NA NA NA
अब तक मैं वास्तव में आगे नहीं आया था कि अन्य गैर-तिथि स्तंभों को फ़िल्टर करना,
is.POSIXt <- function(x) inherits(x, "POSIXt")
df%>%select(where(is.POSIXt))
चयन के बजाय मुझे शायद एक mutate_at या हालत के रूप में कुछ का उपयोग करना चाहिए, लेकिन उन शेष 200 दिनांक / समय कॉलमों की सभी जांच करने का सबसे अच्छा तरीका क्या है और फिर नव निर्मित कॉलमों में जल्द से जल्द / नवीनतम तिथि असाइन करें (जबकि NA को अनदेखा करते हुए मान)।
जवाब
हम उपयोग कर सकते हैं pmax
और pmin
'तारीख' कॉलम पर प्रत्येक पंक्ति के लिए जल्द से जल्द और नवीनतम तारीख वापस जाने के लिए
library(dplyr)
df %>%
mutate(max_date = do.call(pmax, c(select(., starts_with('date')), na.rm = TRUE)),
min_date = do.call(pmin, c(select(., starts_with('date')),
na.rm = TRUE)))
# ID Other_columns date_column date_column2 date_column3 max_date min_date
#1 1 numeric 2019-11-04 19:33:50 2019-11-05 15:33:50 2019-11-05 16:33:50 2019-11-05 16:33:50 2019-11-04 19:33:50
#2 2 numeric <NA> 2019-11-04 17:20:10 2019-11-09 19:12:50 2019-11-09 19:12:50 2019-11-04 17:20:10
#3 3 numeric 2019-11-07 20:33:50 <NA> 2019-11-04 18:31:50 2019-11-07 20:33:50 2019-11-04 18:31:50
#4 4 <NA> <NA> <NA> <NA> <NA> <NA>
या किसी अन्य विकल्प के rowwise
साथc_across
df %>%
rowwise() %>%
mutate(max_date = max(as.POSIXct(c_across(starts_with('date'))),
na.rm = TRUE),
min_date = min(as.POSIXct(c_across(starts_with('date'))),
na.rm = TRUE))
-पूरा
# A tibble: 4 x 7
# Rowwise:
# ID Other_columns date_column date_column2 date_column3 max_date min_date
# <int> <chr> <chr> <chr> <chr> <dttm> <dttm>
#1 1 numeric 2019-11-04 19:33:50 2019-11-05 15:33:50 2019-11-05 16:33:50 2019-11-05 16:33:50 2019-11-04 19:33:50
#2 2 numeric <NA> 2019-11-04 17:20:10 2019-11-09 19:12:50 2019-11-09 19:12:50 2019-11-04 17:20:10
#3 3 numeric 2019-11-07 20:33:50 <NA> 2019-11-04 18:31:50 2019-11-07 20:33:50 2019-11-04 18:31:50
#4 4 <NA> <NA> <NA> <NA> NA NA NA NA
डेटा
df <- structure(list(ID = 1:4, Other_columns = c("numeric", "numeric",
"numeric", NA), date_column = c("2019-11-04 19:33:50", NA, "2019-11-07 20:33:50",
NA), date_column2 = c("2019-11-05 15:33:50", "2019-11-04 17:20:10",
NA, NA), date_column3 = c("2019-11-05 16:33:50", "2019-11-09 19:12:50",
"2019-11-04 18:31:50", NA)), class = "data.frame", row.names = c(NA,
-4L))
यहां एक और दृष्टिकोण है जिसे आप किसी भी पैकेज का उपयोग किए बिना उपयोग कर सकते हैं।
सबसे पहले, तिथि कॉलम के लिए डेटा प्राप्त करें, और इससे आप apply
प्रत्येक पंक्ति में फ़ंक्शन का उपयोग अधिकतम और न्यूनतम मूल्य प्राप्त करने के लिए कर सकते हैं । यहाँ उदाहरण है:
df_date = df[, sapply(df, FUN = function(x) class(x)[1]) %in% c("POSIXct", "POSIXt")]
df$max = apply(df_date, 2, FUN = function(x) max(x, na.rm = TRUE) df$min = apply(df_date, 2, FUN = function(x) min(x, na.rm = TRUE)
डेटा
structure(list(ID = 1:4, Other_columns = c("numeric", "numeric",
"numeric", NA), date_column = structure(c(1572876230, NA, 1573139030,
NA), class = c("POSIXct", "POSIXt"), tzone = ""), date_column2 = structure(c(1572948230,
1572868210, NA, NA), class = c("POSIXct", "POSIXt"), tzone = ""),
date_column3 = structure(c(1572951830, 1573306970, 1572872510,
NA), class = c("POSIXct", "POSIXt"), tzone = "")), class = "data.frame", row.names = c(NA,
-4L))