दिलचस्प पोस्ट
सी ++ स्थैतिक सदस्य प्रायः (अंदर टेम्पलेट मज़ेदार) परिपत्र प्रगति बार के साथ टाइमर नीचे गणना करें सेकंड में दो तिथियों के बीच समय का अंतर प्राप्त करें जैक्सन JSON और सीतनिद्रा में होना जेपीए मुद्दे के साथ अनंत पुनरावर्ती आपको कंप्यूटर की कुल रैम की संख्या कैसे मिलती है? सी ++ और जावा में "सामान्य" प्रकार के बीच अंतर क्या हैं? क्या मुझे एक PHP वर्ग पर कॉन्स्ट की परिभाषा मिल सकती है? क्या मेरे XML साइटमैप के लिए मुझे सामग्री-प्रकार मान भेजना चाहिए? टैग के बीच पाठ निकालने के लिए जावा रेगेक्स मैं jQuery के साथ कुकी कैसे सेट / अनसेट करूं? XmlNode में सी # से विशेषता मान कैसे पढ़ा जाए? NSDate को विशेष रूप से शैलियों, दोनों वर्ष, महीने, दिन और घंटे, मिनट, सेकंड के लिए स्वरूपण करना पायथन (और पायथन सी एपीआई): __new__ बनाम __init__ IIS7 पर क्लासिक एएसपी: 500 आंतरिक सर्वर त्रुटि पर ब्राउज़र में त्रुटियों को भेजने से इनकार करते हुए बैकस्लैश दो बार क्यों दिखाई देते हैं?

एक स्तंभ में सीमांकित स्ट्रिंग विभाजित करें और नई पंक्तियों के रूप में डालें

मेरे पास एक डेटा फ्रेम है जैसा का अनुसरण करें:

+-----+-------+ | V1 | V2 | +-----+-------+ | 1 | a,b,c | | 2 | a,c | | 3 | b,d | | 4 | e,f | | . | . | +-----+-------+ 

वर्णमाला के प्रत्येक अक्षर को अल्पविराम द्वारा अलग किया गया है। मैं प्रत्येक अल्पविराम पर V2 को विभाजित करना चाहूंगा और नई पंक्तियों के रूप में विभाजित तार डालें। उदाहरण के लिए, वांछित उत्पादन होगा:

 +----+----+ | V1 | V2 | +----+----+ | 1 | a | | 1 | b | | 1 | c | | 2 | a | | 2 | c | | 3 | b | | 3 | d | | 4 | e | | 4 | f | +----+----+ 

मैं पहली बार V2 को strsplit() लिए strsplit() का उपयोग करने की कोशिश कर रहा हूं, फिर सूची को डेटा फ्रेम में डालें। यह काम नहीं कर रहा था किसी भी तरह की सहायता को आभार समझेंगे।

वेब के समाधान से एकत्रित समाधान "एक स्तंभ में सीमांकित स्ट्रिंग विभाजित करें और नई पंक्तियों के रूप में डालें"

यह करने का एक और तरीका है …

 df <- read.table(textConnection("1|a,b,c\n2|a,c\n3|b,d\n4|e,f"), header = F, sep = "|", stringsAsFactors = F) df ## V1 V2 ## 1 1 a,b,c ## 2 2 a,c ## 3 3 b,d ## 4 4 e,f s <- strsplit(df$V2, split = ",") data.frame(V1 = rep(df$V1, sapply(s, length)), V2 = unlist(s)) ## V1 V2 ## 1 1 a ## 2 1 b ## 3 1 c ## 4 2 a ## 5 2 c ## 6 3 b ## 7 3 d ## 8 4 e ## 9 4 f 

दिसंबर 2014 तक, यह हेडली विकिम के टिडिर पैकेज से अवांछित फ़ंक्शन का उपयोग करके किया जा सकता है (जारी नोट http://blog.rstudio.org/2014/12/08/tidyr-0-2-0/ देखें )

 > library(tidyr) > library(dplyr) > mydf V1 V2 2 1 a,b,c 3 2 a,c 4 3 b,d 5 4 e,f 6 . . > mydf %>% mutate(V2 = strsplit(as.character(V2), ",")) %>% unnest(V2) V1 V2 1 1 a 2 1 b 3 1 c 4 2 a 5 2 c 6 3 b 7 3 d 8 4 e 9 4 f 10 . . 

यहाँ एक data.table समाधान है:

 d.df <- read.table(header=T, text="V1 | V2 1 | a,b,c 2 | a,c 3 | b,d 4 | e,f", stringsAsFactors=F, sep="|", strip.white = TRUE) require(data.table) d.dt <- data.table(d.df, key="V1") out <- d.dt[, list(V2 = unlist(strsplit(V2, ","))), by=V1] # V1 V2 # 1: 1 a # 2: 1 b # 3: 1 c # 4: 2 a # 5: 2 c # 6: 3 b # 7: 3 d # 8: 4 e # 9: 4 f > sapply(out$V2, nchar) # (or simply nchar(out$V2)) # abcacbdef # 1 1 1 1 1 1 1 1 1 

अब आप टीडीर 0.5.0 का separate_rows स्ट्रिंग्स का उपयोग कर सकते हैं strsplit + unnest स्थान पर।

उदाहरण के लिए:

 library(tidyr) (df <- read.table(textConnection("1|a,b,c\n2|a,c\n3|b,d\n4|e,f"), header = F, sep = "|", stringsAsFactors = F)) 
  V1 V2 1 1 a,b,c 2 2 a,c 3 3 b,d 4 4 e,f 
 separate_rows(df, V2) 

देता है:

  V1 V2 1 1 a 2 1 b 3 1 c 4 2 a 5 2 c 6 3 b 7 3 d 8 4 e 9 4 f 

संदर्भ देखें: https://blog.rstudio.org/2016/06/13/tidir-0-5-0/

आप "splitstackshape" पैकेज से direction = "long" साथ cSplit पर विचार कर सकते हैं।

उपयोग होगा:

 cSplit(mydf, "V2", ",", "long") ## V1 V2 ## 1: 1 a ## 2: 1 b ## 3: 1 c ## 4: 2 a ## 5: 2 c ## 6: 3 b ## 7: 3 d ## 8: 4 e ## 9: 4 f 

पुराने उत्तर ….

यहां आधार आर का उपयोग करते हुए एक दृष्टिकोण है। यह मानता है कि हम "mydf" नामक data.frame साथ शुरू कर रहे हैं। यह दूसरे कॉलम में एक अलग data.frame रूप में पढ़ने के लिए read.csv का उपयोग करता है, जो हम आपके स्रोत डेटा से पहले कॉलम के साथ जोड़ते हैं। अंत में, आप डेटा को लंबे समय तक रूपांतरित करने के लिए reshape का उपयोग करते हैं।

 temp <- data.frame(Ind = mydf$V1, read.csv(text = as.character(mydf$V2), header = FALSE)) temp1 <- reshape(temp, direction = "long", idvar = "Ind", timevar = "time", varying = 2:ncol(temp), sep = "") temp1[!temp1$V == "", c("Ind", "V")] # Ind V # 1.1 1 a # 2.1 2 a # 3.1 3 b # 4.1 4 e # 1.2 1 b # 2.2 2 c # 3.2 3 d # 4.2 4 f # 1.3 1 c 

एक और काफी सीधा विकल्प है:

 stack( setNames( sapply(strsplit(mydf$V2, ","), function(x) gsub("^\\s|\\s$", "", x)), mydf$V1)) values ind 1 a 1 2 b 1 3 c 1 4 a 2 5 c 2 6 b 3 7 d 3 8 e 4 9 f 4 

एक अन्य data.table समाधान data.table समाधान, जो मूल डेटा में किसी भी विशिष्ट फ़ील्ड के अस्तित्व पर निर्भर नहीं करता है।

 DT = data.table(read.table(header=T, text="blah | splitme T | a,b,c T | a,c F | b,d F | e,f", stringsAsFactors=F, sep="|", strip.white = TRUE)) DT[,.( blah , splitme , splitted=unlist(strsplit(splitme, ",")) ),by=seq_len(nrow(DT))] 

महत्वपूर्ण बात यह है by=seq_len(nrow(DT)) , यह 'नकली' uniqueID है जिस पर बंटवारे होते हैं। यह by=.I उपयोग करने के लिए मोहक है by=.I इसके बजाय, जैसा कि इसे परिभाषित किया जाना चाहिए, लेकिन .I एक जादुई बात है जो इसके मूल्य को बदलता है, बेहतर by=seq_len(nrow(DT))

आउटपुट में तीन कॉलम हैं। हम केवल दो मौजूदा कॉलम का नाम देते हैं, और फिर एक विभाजन के रूप में तीसरे की गणना करते हैं

 .( blah # first column of original , splitme # second column of original , splitted = unlist(strsplit(splitme, ",")) )