2016-11-09 95 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 
相关问题