2017-09-11 66 views
-2

解析字符串列名/列值的單個矢量我有一個單獨的字符串值就像一列:我想將其轉換爲使用模式的數據幀如何通過模式

         strings 
1 J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61 
2 J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61 

。例如,字符串中的前兩個字符位置是第一列的名稱(J9),第三個位置是第一列的值(6)。模式是2,1,2,1 ...

我想要的是類似於Excel中的文本到列功能。我如何在R中做到這一點?

預期輸出:

J9 C7 5D 
6 5 5 and so on.. 
6 5 5 and so on.. 
+0

點擊圖片鏈接,我已經使用Excel (text to columns function)轉換..但我想在R. – user8545255

+1

請不要提供數據作爲圖像。將它作爲可以讀入R的文本提供。此外,解釋從輸入到輸出的算法,併爲您嘗試的內容提供R代碼。 –

+0

@ user8545255 - 我注意到需要在您提供的示例字符串的末尾添加一個額外的數字。所以請使用我在嘗試解決方案時提供的示例字符串。 – www

回答

3

有幾種方法可以做到這一點,但這裏有一個直觀的方法,可以幫助傳授一些有用[R概念的過程:

x <- c("J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61") 

colNames <- paste0(unlist(strsplit(x, ""))[c(TRUE,FALSE,FALSE)], 
        unlist(strsplit(x, ""))[c(FALSE,TRUE,FALSE)]) 

values <- paste0(unlist(strsplit(x, ""))[c(FALSE,FALSE,TRUE)]) 

df <- data.frame(matrix(values,nrow=1)) 
colnames(df) <- colNames 

輸出:

J9 C7 D5 I9 Z9 W3 S7 H8 K6 Y4 B9 R4 L4 U6 
1 6 5 6 6 5 9 9 9 9 9 9 9 9 1 

編輯:

如果你有多個字符串這樣,你必須合併成一個數據幀,這裏有一個選項:

df <- data.frame(strings=c("J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61", 
          "J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61"), 
       stringsAsFactors = FALSE) 

colNames <- paste0(unlist(strsplit(df[1,], ""))[c(TRUE,FALSE,FALSE)], 
        unlist(strsplit(df[1,], ""))[c(FALSE,TRUE,FALSE)]) 

x <- lapply(df$strings, 
      function(i) matrix(paste0(unlist(strsplit(i,""))[c(FALSE,FALSE,TRUE)]),nrow=1)) 

require(plyr) 
df <- data.frame(rbind.fill.matrix(x)) 
colnames(df) <- colNames 

輸出:

J9 C7 D5 I9 Z9 W3 S7 H8 K6 Y4 B9 R4 L4 U6 
1 6 5 6 6 5 9 9 9 9 9 9 9 9 1 
2 6 5 6 6 5 9 9 9 9 9 9 9 9 1 
+0

謝謝你,它回答了我的問題。而且,如果我有20萬觀察值(行數),那我該怎麼辦?我遵循相同的程序還是有更好的方法。 – user8545255

+0

@ user8545255 - 不客氣。請參閱上面的編輯以使用多個字符串。 – www

+0

@ user8545255 - 請記住選擇此答案旁邊的複選標記,以幫助社區知道已解決此問題,並幫助其他問題相同的人更快地找到答案。 – www

0

,如果你的行長度相同(共同在.txt文件的東西),你可以嘗試用一個固定的寬度格式:

read.fwf() 

read.fwf(yourfile.txt, widths=c(2,1,2,1), colnames=c(variable1,value1,variable2,value2)) 
+0

有趣的答案。你能提供一些樣本數據來測試它嗎? – www

+0

'rio_frio < - read.fwf(「http://smn.conagua.gob.mx/tools/RESOURCES/Diarios/15082。txt「,widths = c(12,6,7,7,4),skip = 21)'(在這種情況下,你必須刪除最後一行)'rio_frio < - rio_frio [-dim(rio_frio)[1], ]'然後是'colnames(rio_frio)< - c(「date」,「precipitation」,「evaporation」,「tmax」,「tmin」)' –