मैं किसी ऐसे व्यक्ति की मदद कर रहा हूं जो उस समाधान तक पहुंचने की कोशिश कर रहा है जो वे चाहते हैं कि वे जिस कोड के साथ आए हैं, उसमें बहुत अधिक बदलाव किए बिना। मुझे पता है कि लूप के लिए जरूरी नहीं है। उदाहरण के लिए, आप datenumeric <- as.Date(datenumeric, "%Y%m%d") को lapply में पास करने से पहले उनके convertdatereadable फ़ंक्शन में जोड़कर इसे हल कर सकते हैं। मुझे लूप का उपयोग करके समान परिणामों को दोहराने में समस्या हो रही है।

अनुरोध

dat में निम्न double मानों वाला एक date कॉलम है:

1947.01
1947.02
1947.03
1947.04
1947.05

अनुरोध date कॉलम को दिनांक प्रारूप format = "%Y%m%d" में बदलने का है।

पुनरुत्पादित उदाहरण

dat <- structure(list(date = c(1947.01000976562, 1947.02001953125, 1947.03002929688, 
1947.0400390625, 1947.05004882812), sp500 = c(15.210000038147, 
15.8000001907349, 15.1599998474121, 14.6000003814697, 14.3400001525879
), divyld = c(4.48999977111816, 4.38000011444092, 4.6100001335144, 
4.75, 5.05000019073486), i3 = c(0.379999995231628, 0.379999995231628, 
0.379999995231628, 0.379999995231628, 0.379999995231628), ip = c(22.3999996185303, 
22.5, 22.6000003814697, 22.5, 22.6000003814697), pcsp = c(NA, 
46.5483322143555, -48.6076202392578, -44.3271369934082, -21.3698806762695
), rsp500 = c(NA, 50.9283332824707, -43.9976196289062, -39.5771369934082, 
-16.319881439209), pcip = c(NA, 5.35716342926025, 5.33335399627686, 
-5.30975437164307, 5.33335399627686), ci3 = c(NA, 0, 0, 0, 0), 
    ci3_1 = c(NA, NA, 0, 0, 0), ci3_2 = c(NA, NA, NA, 0, 0), 
    pcip_1 = c(NA, NA, 5.35716342926025, 5.33335399627686, -5.30975437164307
    ), pcip_2 = c(NA, NA, NA, 5.35716342926025, 5.33335399627686
    ), pcip_3 = c(NA, NA, NA, NA, 5.35716342926025), pcsp_1 = c(NA, 
    NA, 46.5483322143555, -48.6076202392578, -44.3271369934082
    ), pcsp_2 = c(NA, NA, NA, 46.5483322143555, -48.6076202392578
    ), pcsp_3 = c(NA, NA, NA, NA, 46.5483322143555), month = c(-156, 
    -155, -154, -153, -152)), row.names = c(NA, 5L), class = "data.frame")

कोड जिसमें उनका परिवर्तनीय दिनांक पठनीय कार्य शामिल है

convertdatereadable <- function(datenumeric){
    datenumeric <- trunc(datenumeric * 10000 + 1)
    datenumeric <- as.character(datenumeric)
    return(datenumeric)
}

dat[1] <- lapply(dat[1], convertdatereadable)


for (n in 1:nrow(dat)){
 dat$date <- as.Date(dat[n, 1], format = "%Y%m%d")
}

अपनी वर्तमान स्थिति में लूप के लिए सही प्रारूप आउटपुट करता है, लेकिन दुर्भाग्य से, सभी 5 पंक्तियों के लिए पहली तारीख की नकल कर रहा है।

गलत वर्तमान आउटपुट


dat[1]

#>         date
#> 1 1947-01-01
#> 2 1947-01-01
#> 3 1947-01-01
#> 4 1947-01-01
#> 5 1947-01-01

फॉर लूप रखते हुए वांछित आउटपुट


dat[1]

#>         date
#> 1 1947-01-01
#> 2 1947-02-01
#> 3 1947-03-01
#> 4 1947-04-01
#> 5 1947-05-01

मैंने सोचा कि यह काम करेगा, लेकिन यह नहीं करता है:

for (n in 1:nrow(dat)){
 dat[n, 1] <- as.Date(dat[n, 1], format = "%Y%m%d")
}
1
iamericfletcher 3 फरवरी 2021, 07:58

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि अन्य ने कहा है, as.Date(..., format="%Y%m%d") का उपयोग करना लूप के बजाय ऐसा करने का तरीका है।

लेकिन यह समझने के लिए कि यहां क्या हो रहा है, इसे तोड़ दें और प्रत्येक पंक्ति के बाद आउटपुट की स्थिति की जांच करें:

सबसे पहले, लूप को दोनों पक्षों को n द्वारा अनुक्रमित करने के लिए ठीक करें ताकि प्रत्येक मान बदले में ओवरराइट हो जाए:

for (n in 1:nrow(dat)){
 dat$date[n] <- as.Date(dat$date[n], format = "%Y%m%d")
}

इसका परिणाम १९७०-०१-०१ के बाद से दिनों की संख्या के एक चरित्र प्रतिनिधित्व में होता है (तिथियां आर में संख्यात्मक संस्करण के रूप में संग्रहीत की जाती हैं):

dat$date
#[1] "-8401" "-8370" "-8342" "-8311" "-8281"
class(dat$date)
#[1] "character"

चरित्र और संख्यात्मक क्यों नहीं? क्योंकि आप ]<- का उपयोग कर रहे हैं, <- का नहीं, यानी आप पूरे dat$date कॉलम को ओवरराइट नहीं कर रहे हैं, बल्कि प्रत्येक dat$date[1], dat$date[2] आदि को ओवरराइट कर रहे हैं। इस मामले में स्रोत class रखें क्योंकि संख्यात्मक डेटा को हमेशा एक चरित्र के लिए मजबूर किया जा सकता है, लेकिन वर्ण डेटा को एक संख्या के लिए अनिवार्य रूप से मजबूर नहीं किया जा सकता है। उदा.:

x <- c("a","b","c")
x[1] <- 1
x
#[1] "1" "b" "c"
 
 
x <- c(1,2,3)
x[1] <- "a"
x
#[1] "a" "2" "3"

यदि आप पूरी वस्तु को अधिलेखित कर देते हैं, तो वर्ग बदल जाएगा:

x <- c("a","b","c")
x <- c(1,2,3)
x
#[1] 1 2 3

फिर आपको कक्षा को वापस करने के लिए बाध्य करने की आवश्यकता है:

class(dat$date) <- "Date"
dat$date
#[1] "1947-01-01" "1947-02-01" "1947-03-01" "1947-04-01" "1947-05-01"
class(dat$date)
#[1] "Date"

आप स्पष्ट रूप से परिवर्तित करके भी वही परिणाम प्राप्त कर सकते हैं:

dat$date <- as.Date(as.numeric(dat$date), origin="1970-01-01")
1
thelatemail 4 फरवरी 2021, 03:16

आप लगभग कर चुके हैं। आपको बस नीचे दिए गए लूप में वेरिएबल को बदलने की जरूरत है:

for (n in 1:nrow(dat)){
 dat$crcteddate <- as.Date(dat$date, format = "%Y%m%d")
}

यह 'crcteddate' नामक कॉलम बनाएगा और निम्न आउटपुट देता है:

"1947-01-01" "1947-02-01" "1947-03-01" "1947-04-01" "1947-05-01"

आपने सीधे डेटा $ दिनांक को कॉल करने के बजाय दिनांक कॉलम डेटा [एन, 1] को गलती से बुलाया है।

1
doctshind s 3 फरवरी 2021, 10:40