R [डुप्लिकेट] में प्रत्येक पंक्ति के भीतर सबसे प्राचीन और नवीनतम तिथि ज्ञात करें

Dec 02 2020

मेरे पास 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 को अनदेखा करते हुए मान)।

जवाब

2 akrun Dec 02 2020 at 01:11

हम उपयोग कर सकते हैं 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))



  
Neeraj Dec 02 2020 at 02:58

यहां एक और दृष्टिकोण है जिसे आप किसी भी पैकेज का उपयोग किए बिना उपयोग कर सकते हैं।

सबसे पहले, तिथि कॉलम के लिए डेटा प्राप्त करें, और इससे आप 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))