2016-11-09 91 views
4

我有一個字符串,其結構和長度可連續改變,那就是將字符串轉換爲數據幀,包括列名

輸入:

X <- ("A=12&B=15&C=15") 
Y <- ("A=12&B=15&C=15&D=32&E=53") 

我一直在尋找這個字符串轉換爲數據幀

輸出預期:

數據幀X

A B C 
12 15 15 

和數據幀ÿ

A B C D E 
12 15 15 32 53 

我累了是這樣的:

X <- as.data.frame(strsplit(X, split="&")) 

但這並沒有爲我工作,因爲它創建只有一個列,列名被搞砸了。

PS:我不能硬編碼的列名,因爲他們可以改變,並且在任何給定時間的字符串將只包含一個行

+1

'的eval(解析(文=膏( 「data.frame(」 GSUB( 「&」,」 「,X),」)「)))'我對這個建議感覺不好,但是在目前的情況下可能並不是那麼可怕。 – thelatemail

回答

5

一種選擇是提取數字部分從字符串,並與閱讀read.table。模式[^0-9]+表示一個或多個不是數字的字符,並將其替換爲第一個gsub中的空格,使用read.table讀取該空格,然後在col.names參數中指定列名,並刪除所有非字符的字符大寫字母(第二gsub

f1 <- function(str1){ 
read.table(text=gsub("[^0-9]+", " ", str1), 
     col.names = scan(text=trimws(gsub("[^A-Z]+", " ", str1)), 
      what = "", sep=" ", quiet=TRUE)) 
} 

f1(X) 
# A B C 
#1 12 15 15 
f1(Y) 
# A B C D E 
#1 12 15 15 32 53 
+1

精美的作品,等待兩分鐘後再接受你的! –

+0

如果沒有太多要問,你是否介意解釋你的代碼是如何工作的,如果不適合我的話,其他人會覺得很有幫助(我肯定會投票贊成) –

+0

@ USER3875610當然,我會在更新筆記本電腦變得很慢。 – akrun

3

你可以試試這個太:

library(stringr) 
res <- str_match_all(X, "([A-Z]+)=([0-9]+)")[[1]] 
df <- as.data.frame(matrix(as.integer(res[,3]), nrow=1)) 
names(df) <- res[,2] 

df 
    A B C 
1 12 15 15 
相關問題