【问题标题】:Convert a string to data frame, including column names将字符串转换为数据框,包括列名
【发布时间】:2017-03-22 21:30:48
【问题描述】:

我有一个字符串,其结构和长度可以不断变化,即

输入:

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

和数据框 Y

 A  B  C  D  E
 12 15 15 32 53

让我厌烦的是:

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

但这对我不起作用,因为它只创建了一个列并且列名被弄乱了。

P.S:我无法对列名进行硬编码,因为它们可能会有所不同,并且在任何给定时间,一个字符串只会包含一行

【问题讨论】:

  • eval(parse(text=paste("data.frame(",gsub("&amp;", ",", X),")"))) 我觉得建议它很糟糕,但在目前的情况下,也许它并不是那么可怕。

标签: r string dataframe


【解决方案1】:

一种选择是从字符串中提取数字部分,并使用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

【讨论】:

  • 效果很好,会等两分钟才接受你的!
  • 如果问的不是太多,您介意解释一下您的代码是如何工作的吗,如果不适合我,其他人会觉得它有帮助(肯定是我的一票)
  • @USER3875610 当然,当我的笔记本电脑变得如此缓慢时,我会更新它。
【解决方案2】:

你也可以试试这个:

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

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2022-08-17
    • 2019-05-07
    • 1970-01-01
    相关资源
    最近更新 更多