2017-04-04 166 views
0

數據我已經是這樣的:如何將此非結構化數據轉換爲結構化?

data <- c("24-March-2017  text1       874874455221112    Text text text10", 
    "25-March-2017  text2       54654656TEXT     Text text 11", 
    "24-March-2017  text3       874874455221112    Text text text 12", 
    "25-March-2017     text4       54654656TEXT     Text text 13", 
    "26-March-2017  text3    54654TEXT Text text text 14", 
    "27-March-2017    text5      6546TEXT Text text text 15", 
    "28-March-2017  text6       546476876586TExt Text text text 16", 
    "29-March-2017     text7  23453453TEXT  Text text 17") 

enter image description here

我想這個數據轉換成基於每列之間的空間結構形式。前三行看起來像我希望數據看起來像。最終的結果需要看起來像:

enter image description here

基本上是:

  1. 第一列(日期)開始於零(無需更換)
  2. 第二列必須在位置開始20
  3. 第三列開始於位置50
  4. 最後一列開始於80
+0

'read.table(text = data,fill = TRUE,header = FALSE)'給你一個很好的R數據集,可以作爲轉換爲新格式的乾淨基礎。 – thelatemail

+0

爲什麼不把它保存爲.csv,然後使用LibreOffice Calc加載它?它可以選擇加載由空格分隔的文本文件(以及其他字符),也可以選擇合併分隔符。稍後,您可以使用函數* concatenate *合併最後一列。 – Rodrigo

回答

3

這是根據各地提供的數據,並假定:

  • 有四列
  • 前三個都在其中沒有空白和空白
  • 分離的最後一列可以包含空格

,拿出匹配的子串,rbindş他們進入一個矩陣,刪除全局匹配,轉換爲data.frame,然後通過sprintf獲得固定寬度輸出。

data %>% 
    regmatches(regexec("^(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.*?)$", .)) %>% 
    do.call("rbind", .) %>% 
    .[, -1] %>% 
    as.data.frame(stringsAsFactors = FALSE) %>% 
    c(list("%-20s%-30s%-30s%s"), .) %>% 
    do.call("sprintf", .) 

# [1] "24-March-2017  text1       874874455221112    Text text text10" 
# [2] "25-March-2017  text2       54654656TEXT     Text text 11"  
# [3] "24-March-2017  text3       874874455221112    Text text text 12" 
# [4] "25-March-2017  text4       54654656TEXT     Text text 13"  
# [5] "26-March-2017  text3       54654TEXT      Text text text 14" 
# [6] "27-March-2017  text5       6546TEXT      Text text text 15" 
# [7] "28-March-2017  text6       546476876586TExt    Text text text 16" 
# [8] "29-March-2017  text7       23453453TEXT     Text text 17" 
+0

很棒的答案。我想申請其他表格。 (1)第一列沒有空格(2)第二列有1-5個空格(所有單個空格)(3)第三列和第四列有1個空格到3個單個空格(4)第5列中沒有空格,最後(5)與上面相同的第6列包含多個空格。 – Curious

+0

列間距如何? –

+0

第一列從零開始,第二列在20,第三列在50,第四列在80,第五列在120,最後一列在180. – Curious

3
do.call('rbind', lapply(df, function(x) { # loop through vector df 
    x <- strsplit(x, "\ ")[[1]]    # split string by spaces 
    x <- x[which(unlist(lapply(x, nchar)) > 0)] # remove zero length strings 
    x <- c(x[1:3], paste(x[4:length(x)], collapse = " ")) # collapse all elements from 4 to end 
    return(x) # return formatted vector 
})) 

#     [,1] [,2]    [,3]     [,4]    
# [1,] "24-March-2017" "text1" "874874455221112" "Text text text10" 
# [2,] "25-March-2017" "text2" "54654656TEXT"  "Text text 11"  
# [3,] "24-March-2017" "text3" "874874455221112" "Text text text 12" 
# [4,] "25-March-2017" "text4" "54654656TEXT"  "Text text 13"  
# [5,] "26-March-2017" "text3" "54654TEXT"  "Text text text 14" 
# [6,] "27-March-2017" "text5" "6546TEXT"   "Text text text 15" 
# [7,] "28-March-2017" "text6" "546476876586TExt" "Text text text 16" 
# [8,] "29-March-2017" "text7" "23453453TEXT"  "Text text 17" 

基於@thelatemail評論

df <- read.table(text=df,fill=TRUE,header=FALSE) 
df[, 4] <- apply(df[, 4:ncol(df)], 1, function(x) { 
    paste(x[ ! is.na(x) ], collapse = ' ') }) 
df <- df[, 1:4] 
df 
#    V1 V2    V3    V4 
# 1 24-March-2017 text1 874874455221112 Text text text10 
# 2 25-March-2017 text2  54654656TEXT  Text text 11 
# 3 24-March-2017 text3 874874455221112 Text text text 12 
# 4 25-March-2017 text4  54654656TEXT  Text text 13 
# 5 26-March-2017 text3  54654TEXT Text text text 14 
# 6 27-March-2017 text5   6546TEXT Text text text 15 
# 7 28-March-2017 text6 546476876586TExt Text text text 16 
# 8 29-March-2017 text7  23453453TEXT  Text text 17 

數據:

df <- c("24-March-2017  text1       874874455221112    Text text text10", 
      "25-March-2017  text2       54654656TEXT     Text text 11", 
      "24-March-2017  text3       874874455221112    Text text text 12", 
      "25-March-2017     text4       54654656TEXT     Text text 13", 
      "26-March-2017  text3    54654TEXT Text text text 14", 
      "27-March-2017    text5      6546TEXT Text text text 15", 
      "28-March-2017  text6       546476876586TExt Text text text 16", 
      "29-March-2017     text7  23453453TEXT  Text text 17")