2013-05-07 9 views
6

मैं एक dataframe है कि इस तरह की संख्या एक कॉलम शामिल है में एक लंबी स्ट्रिंग:विभाजन छोटे तार

360010001001002 
360010001001004 
360010001001005 
360010001001006 

मैं 2 अंक, 3 अंक, 5 अंक की टुकड़ों में तोड़ने के लिए चाहते हैं, 1 अंकों , 4 अंक:

36 001 00010 0 1002 
36 001 00010 0 1004 
36 001 00010 0 1005 
36 001 00010 0 1006 

है जैसे कि यह आसान होना चाहिए, लेकिन मैं strsplit प्रलेखन पढ़ रहा हूँ और मैं सुलझा नहीं कर सकते कि मैं लंबाई करके ऐसा कर चाहते हैं लगता है।

+0

है आपका मुख्य आशय क) के लिए ** एक कन्वर्ट इंडेक्स के जोड़े में सबस्ट्रिंग लम्बाई का वेक्टर ** या बी) ** डीएफ में विभाजित कॉलम, और कुशलता से ऐसा करना **: नए अलग डीएफ के रूप में भाग को तोड़ दें। कॉलम (-> ddply (ट्रांसफॉर्म, ...)), या बस एक ही कॉलम पर कुछ स्ट्रिंग मैनिपुलेशन (उदा। '-') डालें? (-> ldply) – smci

+0

मेरी समस्या लंबे समय से हल हो गई है, लेकिन जब से आपने पूछा ... हाँ: मैं उन हिस्सों को अलग कॉलम के रूप में चाहता था। वे एक आईडी नंबर हैं। मुझे वापस जाना होगा और बिल्कुल दिखना होगा, लेकिन भाग का अर्थ है: '36' राज्य है, '001' काउंटी,' 00010 'जनगणना ब्लॉक या कुछ। – Amanda

+0

सही, लेकिन मेरा प्रश्न ए) क्या यह वास्तव में आपके लिए कोई फर्क नहीं पड़ता कि क्या आप इंडेक्स के सादे पुराने जोड़े के बजाय 'चौड़ाई = सी (2,3,5,1,4) 'के मनमानी वेक्टर निर्दिष्ट करते हैं: (1 , 2), (3,5), (6,10), (11,11), (12,15)। कई उत्तरदाताओं ने इस बात पर लटका दिया कि क्या संचयी-सूचकांक-अंकगणित आपके प्रश्न का एक प्रमुख हिस्सा था। बाहर निकलता है यह नहीं था। आप स्पष्टता के लिए reword कर सकते हैं। – smci

उत्तर

4

इस डेटा मान लिया जाये:

x <- c("360010001001002", "360010001001004", "360010001001005", "360010001001006") 

कोशिश यह:

read.fwf(textConnection(x), widths = c(2, 3, 5, 1, 4)) 

यदि x संख्यात्मक है तो x को as.character(x) के साथ इस कथन में प्रतिस्थापित करें।

+0

+1 - सुंदर साफ! मुझे यह याद होगा। – Arun

+0

मैं इसे करने में घायल हूं: 'foo $ count_id <- as.vector (gsub (foo $ fullfipsid, pattern = ".. (...)। *", प्रतिस्थापित करें = "\\ 1")) प्रत्येक खंड के लिए । काम किया। लेकिन मैं इस जवाब को स्वीकार कर रहा हूं बी/सी यह सुरुचिपूर्ण है और यह भी काम करता है। (मैंने इसका परीक्षण किया) – Amanda

8

आप substring उपयोग कर सकते हैं (स्ट्रिंग की लंबाई यह सोचते हैं/संख्या ठीक हो गई है):

xx <- c(360010001001002, 360010001001004, 360010001001005, 360010001001006) 
out <- do.call(rbind, lapply(xx, function(x) as.numeric(substring(x, 
        c(1,3,6,11,12), c(2,5,10,11,15))))) 
out <- as.data.frame(out) 
+0

'ddply (mutate ...)' do.call (rbind, ...) 'से अधिक सुरुचिपूर्ण लगता है? नीचे मेरा जवाब देखें। – smci

+0

और सूचकांक जमा करने के लिए 'cumsum()' – smci

4

एक कार्यात्मक संस्करण:

split.fixed.len <- function(x, lengths) { 
    cum.len <- c(0, cumsum(lengths)) 
    start <- head(cum.len, -1) + 1 
    stop <- tail(cum.len, -1) 
    mapply(substring, list(x), start, stop) 
}  

a <- c(360010001001002, 
     360010001001004, 
     360010001001005, 
     360010001001006) 

split.fixed.len(a, c(2, 3, 5, 1, 4)) 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] "36" "001" "00010" "0" "1002" 
# [2,] "36" "001" "00010" "0" "1004" 
# [3,] "36" "001" "00010" "0" "1005" 
# [4,] "36" "001" "00010" "0" "1006" 
+0

+1 - मैपली का अच्छा उपयोग (हमेशा की तरह)! :) – Arun

0

(वाह, इस कार्य को अविश्वसनीय रूप से भद्दा और दर्दनाक अजगर की तुलना में है। Anyhoo ...)

पी एस मैं देख रहा हूँ अब अपने मुख्य आशय-स्ट्रिंग का एक वेक्टर सूचकांक के जोड़े में लंबाई कन्वर्ट करने के लिए किया गया था। आप cumsum() इस्तेमाल कर सकते हैं, तो सभी को एक साथ सूचकांक क्रमबद्ध करें:

ll <- c(2,3,5,1,4) 
sort(c(1, cumsum(ll), (cumsum(ll)+1)[1:(length(ll)-1)])) 
# now extract these as pairs. 

लेकिन यह काफी दर्दनाक है। इसके लिए flodel का उत्तर बेहतर है।

डी.एफ. में विभाजित करने के वास्तविक कार्य के रूप में स्तंभ, और कि कुशलता से कर रही है:

stringr::str_sub() साथ plyr::ddply()/ldply

require(plyr) 
require(stringr) 

df <- data.frame(value=c(360010001001002,360010001001004,360010001001005,360010001001006)) 
df$valc = as.character(df$value) 

df <- ddply(df, .(value), mutate, chk1=str_sub(valc,1,2), chk3=str_sub(valc,3,5), chk6=str_sub(valc,6,10), chk11=str_sub(valc,11,11), chk14=str_sub(valc,12,15)) 

#    value   valc chk1 chk3 chk6 chk11 chk14 
# 1 360010001001002 360010001001002 36 001 00010  0 1002 
# 2 360010001001004 360010001001004 36 001 00010  0 1004 
# 3 360010001001005 360010001001005 36 001 00010  0 1005 
# 4 360010001001006 360010001001006 36 001 00010  0 1006 
0

आप stringi पैकेज से इस सुविधा का उपयोग कर सकते हैं सुंदर ढंग से जोड़ती है

splitpoints <- cumsum(c(2, 3, 5, 1,4)) 
stri_sub("360010001001002",c(1,splitpoints[-length(splitpoints)]+1),splitpoints) 
संबंधित मुद्दे