दिलचस्प पोस्ट
एएसपी.नेट एमवीसी में सत्र चर बाइट सरणी में परिवर्तित करें (जावा) गतिशील रूप से एक AngularJS नियंत्रक लोड कर रहा है पृष्ठभूमि सूचीदृश्य स्क्रॉल करते समय काला हो जाता है "," और "और" पिछले आइटम से पहले जोड़ने के साथ इम्प्लोड सरणी निर्धारित करें कि क्या JSON एक JSONObject या JSONArray है फोनगैप परियोजनाओं में ऐप आइकन कैसे जोड़ें? मैं एक Git रिपॉजिटरी से .DS_Store फ़ाइलों को कैसे निकाल सकता हूं? एक्स-एक्स के चारों ओर एक आकृति को घुमाने के लिए हम एक स्थिर विधि में 'इस' कीवर्ड का उपयोग क्यों नहीं कर सकते? jQuery 'इनपुट' घटना सख्त मानदंड: संदर्भ से केवल चर को पारित किया जाना चाहिए $ (दस्तावेज़) .click () iPhone पर सही ढंग से काम नहीं कर रहा है jquery एएसपी.नेट एमवीसी में अनुरोध थ्रॉटलिंग को लागू करने का सर्वोत्तम तरीका? क्या एसक्यूएललेमी के पास डीजांगो के गेट_ओआरएक्रेट के बराबर है?

विस्तृत से लेकर लंबे स्वरूप तक डेटा.फ्रेम को फिर से स्थानांतरित करना

मुझे अपना data.frame को एक विस्तृत तालिका से एक लंबी तालिका में परिवर्तित करने में परेशानी हो रही है। इस समय यह इस तरह दिखता है:

 Code Country 1950 1951 1952 1953 1954 AFG Afghanistan 20,249 21,352 22,532 23,557 24,555 ALB Albania 8,097 8,986 10,058 11,123 12,246 

अब मैं इस data.frame को एक लंबी data.frame में बदलना data.frame data.framedata.frame कुछ इस तरह:

 Code Country Year Value AFG Afghanistan 1950 20,249 AFG Afghanistan 1951 21,352 AFG Afghanistan 1952 22,532 AFG Afghanistan 1953 23,557 AFG Afghanistan 1954 24,555 ALB Albania 1950 8,097 ALB Albania 1951 8,986 ALB Albania 1952 10,058 ALB Albania 1953 11,123 ALB Albania 1954 12,246 

मैंने देखा है और melt() और फिर से काम करना reshape() फ़ंक्शंस के साथ पहले से ही कोशिश की है क्योंकि कुछ लोग समान प्रश्नों के लिए सुझाव दे रहे थे हालांकि, अभी तक मैं केवल गन्दा परिणाम प्राप्त करता हूं।

यदि यह संभव है तो मैं इसे reshape() फ़ंक्शन के साथ करना चाहूंगा क्योंकि यह थोड़ा संभाल करने के लिए अच्छा लगता है।

वेब के समाधान से एकत्रित समाधान "विस्तृत से लेकर लंबे स्वरूप तक डेटा.फ्रेम को फिर से स्थानांतरित करना"

reshape() को कुछ समय लगता है, जैसे melt / cast । यहाँ reshape के साथ एक समाधान है, अपने डेटा फ्रेम आईडी को मानते हुए d :

 reshape(d, direction="long", varying=list(names(d)[3:7]), v.names="Value", idvar=c("Code","Country"), timevar="Year", times=1950:1954) 

तीन वैकल्पिक समाधान:

1: reshape2 2 के साथ

 library(reshape2) long <- melt(wide, id.vars = c("Code", "Country")) 

दे रही है:

  Code Country variable value 1 AFG Afghanistan 1950 20,249 2 ALB Albania 1950 8,097 3 AFG Afghanistan 1951 21,352 4 ALB Albania 1951 8,986 5 AFG Afghanistan 1952 22,532 6 ALB Albania 1952 10,058 7 AFG Afghanistan 1953 23,557 8 ALB Albania 1953 11,123 9 AFG Afghanistan 1954 24,555 10 ALB Albania 1954 12,246 

कुछ वैकल्पिक नोटिशन जो समान परिणाम देते हैं:

 # you can also define the id-variables by column number melt(wide, id.vars = 1:2) # as an alternative you can also specify the measure-variables # all other variables will then be used as id-variables melt(wide, measure.vars = 3:7) melt(wide, measure.vars = as.character(1950:1954)) 

2: data.table साथ data.table

आप reshape2 पैकेज में एक समान melt फ़ंक्शन का उपयोग कर सकते हैं (जो कि एक विस्तारित और बेहतर कार्यान्वयन है) data.table से data.table भी अधिक मापदंड हैं जो कि reshape2 से reshape2 । आप एक्सपेल के लिए भी चर-स्तंभ का नाम निर्दिष्ट कर सकते हैं:

 library(data.table) long <- melt(setDT(wide), id.vars=c("Code","Country"), variable.name="year") 

कुछ वैकल्पिक नोटिफिकेशन:

 melt(setDT(wide), id.vars = 1:2, variable.name = "year") melt(setDT(wide), measure.vars = 3:7, variable.name = "year") melt(setDT(wide), measure.vars = as.character(1950:1954), variable.name = "year") 

3: के साथ tidyr

 library(tidyr) long <- wide %>% gather(year, value, -c(Code, Country)) 

कुछ वैकल्पिक नोटिफिकेशन:

 wide %>% gather(year, value, -Code, -Country) wide %>% gather(year, value, -1:-2) wide %>% gather(year, value, -(1:2)) wide %>% gather(year, value, -1, -2) wide %>% gather(year, value, 3:7) wide %>% gather(year, value, `1950`:`1954`) 

यदि आप NA मानों को बाहर करना चाहते हैं, तो आप melt करने के साथ-साथ gather कार्यों में na.rm = TRUE जोड़ सकते हैं।


डेटा के साथ एक अन्य समस्या यह है कि मूल्य आर के रूप में वर्ण-मान (संख्या के अनुसार , परिणामस्वरूप) के रूप में पढ़ा जाएगा। आप gsub और as.numeric साथ उस की मरम्मत कर सकते हैं:

 long$value <- as.numeric(gsub(",", "", long$value)) 

या सीधे data.table या dplyr :

 # data.table long <- melt(setDT(wide), id.vars = c("Code","Country"), variable.name = "year")[, value := as.numeric(gsub(",", "", value))] # tidyr and dplyr long <- wide %>% gather(year, value, -c(Code,Country)) %>% mutate(value = as.numeric(gsub(",", "", value))) 

डेटा:

 wide <- read.table(text="Code Country 1950 1951 1952 1953 1954 AFG Afghanistan 20,249 21,352 22,532 23,557 24,555 ALB Albania 8,097 8,986 10,058 11,123 12,246", header=TRUE, check.names=FALSE) 

हेयर यू गो:

 x <- read.table(textConnection( "Code Country 1950 1951 1952 1953 1954 AFG Afghanistan 20,249 21,352 22,532 23,557 24,555 ALB Albania 8,097 8,986 10,058 11,123 12,246"), header=TRUE) library(reshape) x2 <- melt(x,id=c("Code","Country"),variable_name="Year") x2[,"Year"] <- as.numeric(gsub("X","",x2[,"Year"])) 

यहाँ tidyr से gather के उपयोग का एक और उदाहरण दिखाया गया है आप उन स्तंभों को चुन सकते हैं जो उन्हें व्यक्तिगत रूप से निकालकर (जैसा मैं करता हूं), या जिन वर्षों से आप स्पष्ट रूप से चाहते हैं उन्हें शामिल कर सकते हैं।

नोट करें कि, अल्पविराम (और एक्स की जोड़ी अगर check.names = FALSE सेट नहीं है), तो मैं dplyr के mutate को parse_number साथ parse_number प्रयोग कर रहा हूं ताकि टेक्स्ट मानों को वापस संख्या में परिवर्तित किया जा सके। ये सभी tidyverse का हिस्सा हैं और ऐसा library(tidyverse) साथ लोड किया जा सकता है library(tidyverse)

 wide %>% gather(Year, Value, -Code, -Country) %>% mutate(Year = parse_number(Year) , Value = parse_number(Value)) 

यह दिखाता है:

  Code Country Year Value 1 AFG Afghanistan 1950 20249 2 ALB Albania 1950 8097 3 AFG Afghanistan 1951 21352 4 ALB Albania 1951 8986 5 AFG Afghanistan 1952 22532 6 ALB Albania 1952 10058 7 AFG Afghanistan 1953 23557 8 ALB Albania 1953 11123 9 AFG Afghanistan 1954 24555 10 ALB Albania 1954 12246