0

次のようなデータを含むファイル file.txt があります。

<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 のエントリがありません。を使用してデータをデータフレームに分割します。

data.frame(do.call(rbind,strsplit(readLines('file.txt'),'ows_',fixed=T)))

しかし、一部の行でエントリが欠落しているため、データフレームが正しく出力されません。

これを df にエクスポートし、欠損値を NA で埋める方法についての提案。

Req_Name1   ReqPriority    ReqDate
John        High           2012-10-10
Jack        Low            2012-11-10
John        NA             2012-10-10
4

2 に答える 2

2

各行は R での data.frames の作成方法によく似ているため、次のように処理すると面白いと思いました。

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です。

于 2012-10-23T23:14:21.123 に答える
1

flodel のレスポンスの方が優れていますが、正規表現を使ってみました (今は正規表現に少し慣れていないので、これは良かったです)。

あなたのデータを読み込みます:

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' />

データの再構築:

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

これを出力します:

  Req_Name1 ReqPriority    ReqDate
1      John        High 2012-10-10
2      Jack         Low 2012-11-10
3      John        <NA> 2012-12-10
于 2012-10-24T00:36:12.403 に答える