मुझे समझ में नहीं आ रहा है कि डेटा.टेबल अलग-अलग व्यवहार क्यों कर रहा है जब भी मैं डेटा में चेनिंग जोड़ता हूं। आर में टेबल। यहां मेरा कोड है

DT_Trends_Data_3<-copy(DT_Trends_Data_2)  #nothing wrong here 

जब मैं क्वेरी के नीचे निष्पादित करता हूं तो यह एक त्रुटि उत्पन्न करता है

Step 0

DT_Trends_Data_4<-DT_Trends_Data_3[,':='(s_d=sd(last_seen_hour_alerts), m_n=mean(last_seen_hour_alerts),limits = m_n + s_d,flag=ifelse(last_seen_hour_alerts>limits,"Yes","No")),by=.(customer,location_id)]

Error in `[.data.table`(DT_Trends_Data_3, , `:=`(s_d = sd(last_seen_hour_alets),  : 
 ​object 'm_n

हालांकि, जब मैं नीचे दिए गए चरण से ऊपर स्क्रिप्ट चरण चलाता हूं, तो यह बिना किसी समस्या के काम करता है

Step 1

DT_Trends_Data_4<-DT_Trends_Data_3[,':='(s_d=sd(last_seen_hour_alerts)),by=.(customer,location_id)]       


Step 2 

DT_Trends_Data_4<-DT_Trends_Data_3[,':='(s_d=sd(last_seen_hour_alerts), m_n=mean(last_seen_hour_alerts)),by=.(customer,location_id)]


Step 3 

DT_Trends_Data_4<-DT_Trends_Data_3[,':='(s_d=sd(last_seen_hour_alerts), m_n=mean(last_seen_hour_alerts),limits = m_n + s_d),by=.(customer,location_id)]

Step 4 

DT_Trends_Data_4<-DT_Trends_Data_3[,':='(s_d=sd(last_seen_hour_alerts), m_n=mean(last_seen_hour_alerts),limits = m_n + s_d,flag=ifelse(last_seen_hour_alerts>limits,"Yes","No")),by=.(customer,location_id)]

चरण 1 से चरण 4 तक निष्पादित करने के बाद, अब यदि मैं चरण 0 क्वेरी (समेकित/संयुक्त क्वेरी) चलाता हूं, तो यह बिना किसी समस्या के चलता है। और फिर, यदि मैं चरण 0 क्वेरी को प्रारंभ के रूप में निष्पादित करने का प्रयास करता हूं, तो यह चरण 0 में वर्णित त्रुटि को फेंकता है।

मुझे यहां क्या समझ नहीं आ रहा है?

1
Yogesh Kumar 22 फरवरी 2020, 13:05
आप सीमा चर निर्माण में m_n को कॉल करने का प्रयास कर रहे हैं, जबकि यह चर पहले परिभाषित किया गया है लेकिन अभी भी मौजूद नहीं है, जब आप इसे चरणबद्ध चरण में करते हैं, तो चर बनाया गया था और इसलिए यह काम करता है
 – 
PKumar
22 फरवरी 2020, 18:50

2 जवाब

आप कुछ इसी तरह की कोशिश कर सकते हैं:

जैसा कि मैंने टिप्पणियों में उल्लेख किया है, आप limits के निर्माण के लिए वेरिएबल m_n का उपयोग करने का प्रयास कर रहे हैं, क्योंकि वेरिएबल अभी तक नहीं बनाया गया है (हालांकि लिमिट वेरिएबल से पहले परिभाषित किया गया है, यह अभी तक बनाया जाना है ) इसलिए यह त्रुटि फेंकता है, एक काम नीचे की तरह कुछ का उपयोग कर सकता है (जिसमें चेनिंग शामिल है)। जब आप इसे चरणबद्ध तरीके से आजमाते हैं, तो वेरिएबल m_n बन जाता है और अगले चरण के लिए आसानी से उपलब्ध हो जाता है, इसलिए चरणबद्ध निष्पादन कार्य करता है।

iris डेटासेट का उपयोग करना और इसे data.table का उपयोग करके परिवर्तित करना

iris1 <- copy(iris)
setDT(iris1)
iris1[,temp:=mean(Sepal.Length), by=Species][,new_temp:=mean(abs(Sepal.Length-temp)), by=Species][,temp:=NULL]

आउटपुट:

> head(ir)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species new_temp
1:          5.1         3.5          1.4         0.2  setosa  0.27072
2:          4.9         3.0          1.4         0.2  setosa  0.27072
3:          4.7         3.2          1.3         0.2  setosa  0.27072
4:          4.6         3.1          1.5         0.2  setosa  0.27072
5:          5.0         3.6          1.4         0.2  setosa  0.27072
6:          5.4         3.9          1.7         0.4  setosa  0.27072
1
PKumar 22 फरवरी 2020, 19:02

n_m और s_d अभी तक परिभाषित नहीं हैं जब limits का मूल्यांकन किया जा रहा है और इसीलिए कोई त्रुटि है। यहां बताया गया है कि आप इसे कैसे ठीक कर सकते हैं:

DT_Trends_Data_3[, ':=' (s_d = {s_d <- sd(last_seen_hour_alerts)},
        m_ n = {m_n <- mean(last_seen_hour_alerts)},
        limits = {limits <- m_n + s_d},
        flag = ifelse(last_seen_hour_alerts>limits,"Yes","No")),
    by=.(customer,location_id)]

या अधिक स्पष्ट रूप से:

DT_Trends_Data_3[, c("s_d", "m_n", "limits", "flag") := {
    s_d <- sd(last_seen_hour_alerts) 
    m_n <- mean(last_seen_hour_alerts)
    limits <- m_n + s_d
    flag <- ifelse(last_seen_hour_alerts>limits,"Yes","No")
    .(s_d, m_n, limits, flag)
}, by=.(customer,location_id)]
1
chinsoon12 23 फरवरी 2020, 02:22