दिलचस्प पोस्ट
TreeView नियंत्रण में सभी नोड्स तक पहुंच वीबीए लघु-सर्किट `और` विकल्प जावा में द्विदिश बहु-मूल्यवान मानचित्र डब्ल्यूसीएफ सर्विस एप्लीकेशन और डब्ल्यूसीएफ सर्विस लाइब्रेरी में क्या अंतर है? टर्मिनल पर पासवर्ड इनपुट छुपाएं जावा एसएसएल डीबग लॉगिंग को सीमित करना क्या हर समय सिंक्रनाइज़ेशन लॉक अपवाद फेंकने के लिए नहीं किया जा सकता है? मैं JSON डेटा पोस्ट करने के लिए JQuery का उपयोग कैसे कर सकता हूं? "~ / डेस्कटॉप / test.txt: ऐसा कोई फ़ाइल या निर्देशिका नहीं" JFrame के लिए अनुत्तरदायी कुंजीलिस्टर नेटवर्क उपकरण जो धीमी नेटवर्क कनेक्शन का अनुकरण करते हैं सभी कुंजी (या मान) को एक std :: नक्शा से कैसे प्राप्त करें और उन्हें सदिश में रखें? दो धागे को "बिल्कुल" एक ही समय में कैसे प्रारंभ करें PHP पुनरावर्ती निर्देशिका पथ क्या पीडीओ का उपयोग करने के लिए अच्छे ट्यूटोरियल हैं?

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

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

+-----+-------+ | 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() का उपयोग करने की कोशिश कर रहा हूं, फिर सूची को डेटा फ्रेम में डालें। यह काम नहीं कर रहा था किसी भी तरह की सहायता को आभार समझेंगे।

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

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

 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, ",")) )