首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分行并创建新的数据帧

拆分行并创建新的数据帧
EN

Stack Overflow用户
提问于 2012-10-24 05:51:49
回答 2查看 250关注 0票数 0

我有一个名为file.txt的文件,其中的数据如下所示:

代码语言:javascript
复制
<z:row ows_Req_Name1='John' ows_ReqPriority='High' ows_ReqDate='2012-10-10' />
<z:row ows_Req_Name1='Jack' ows_ReqPriority='Low' ows_ReqDate='2012-11-10' />
<z:row ows_Req_Name1='John' ows_ReqDate='2012-12-10' />

并非所有行都包含所有必需的信息。例如,上面的最后一行没有像其他行那样的ReqPriority条目。我把数据分成一个数据帧,

代码语言:javascript
复制
data.frame(do.call(rbind,strsplit(readLines('file.txt'),'ows_',fixed=T)))

但是,由于某些行中缺少条目,因此数据帧不能正确输出。

关于如何将其导出到df并使用NA填充缺少的值的任何建议。

代码语言:javascript
复制
Req_Name1   ReqPriority    ReqDate
John        High           2012-10-10
Jack        Low            2012-11-10
John        NA             2012-10-10
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-24 07:14:21

因为每一行看起来都很像data.frames是如何在R中创建的,所以我认为这样做会很有趣:

代码语言:javascript
复制
x <- readLines('file.txt')
x <- gsub("<z:row (.*) />", "data.frame(\\1)", x)
x <- gsub("ows_", "", x)
x <- gsub(" ", ", ", x)
x
# [1] "data.frame(Req_Name1='John', ReqPriority='High', ReqDate='2012-10-10')"
# [2] "data.frame(Req_Name1='Jack', ReqPriority='Low', ReqDate='2012-11-10')" 
# [3] "data.frame(Req_Name1='John', ReqDate='2012-12-10')"                    

library(plyr)
do.call(rbind.fill, lapply(x, function(z)eval(parse(text = z))))
#   Req_Name1 ReqPriority    ReqDate
# 1      John        High 2012-10-10
# 2      Jack         Low 2012-11-10
# 3      John        <NA> 2012-12-10

但它应该伴随着关于使用eval/parse的常见警告。

票数 2
EN

Stack Overflow用户

发布于 2012-10-24 08:36:12

flodel的响应更好,但我开始使用一些正则表达式(我现在对正则表达式有点生疏,所以这很好):

读入您的数据:

代码语言:javascript
复制
x <- readLines(n=3)
<z:row ows_Req_Name1='John' ows_ReqPriority='High' ows_ReqDate='2012-10-10' />
<z:row ows_Req_Name1='Jack' ows_ReqPriority='Low' ows_ReqDate='2012-11-10' />
<z:row ows_Req_Name1='John' ows_ReqDate='2012-12-10' />

重建数据:

代码语言:javascript
复制
new <- lapply(strsplit(x, " ows_| />"), "[", -1)
new <- lapply(new, function(x) gsub("'", "", x))
tester <- function(x){
   x[match(c("Req_", "ReqP", "ReqD"), substring(x, 1, 4))]
}
new2 <- lapply(lapply(new, tester), function(x){
    gsub("^\\s+|\\s+$", "", gsub(".*=", " ", x))
})

DF <- data.frame(do.call(rbind, new2))
n <- lapply(lapply(new, tester), function(x){
     na.omit(gsub("^\\s+|\\s+$", "", gsub("=.+.", " ", x)))
})
colnames(DF) <- n[[which.max(sapply(n, length))]]
DF

输出如下:

代码语言:javascript
复制
  Req_Name1 ReqPriority    ReqDate
1      John        High 2012-10-10
2      Jack         Low 2012-11-10
3      John        <NA> 2012-12-10
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13039886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档