【问题标题】:Use R to clean a raw, old data使用 R 清理原始的旧数据
【发布时间】:2017-10-22 09:05:17
【问题描述】:

所以我有一个相当古老的原始数据,如下所示:

        1
    *******
    *******
    *******
    *******
      S  H
     HHHHH
        2
    *******
    JSH   K
    *******
    *******
    *******
    *******

第一行有一个数字1,这是一个ID。下面的 2~7 行每行应该有 7 个元素,对应 7 个类别,比如 a1,a2,a3,a4,a5,a6,a7。第 8 行又是一个 ID。因此,对于每个人,我们有 6 行。

归根结底,我想要一个像这样的输出

   ID   a1   a2 a3   a4   a5   a6   a7
1   1    *    *  *    *    *    *    *
2   1    *    *  *    *    *    *    *
3   1    *    *  *    *    *    *    *
4   1    *    *  *    *    *    *    *
5   1 <NA> <NA>  S <NA> <NA>    H <NA>
6   1 <NA>    H  H    H    H    H <NA>
7   2    *    *  *    *    *    *    *
8   2    J    S  H <NA> <NA> <NA>    K
9   2    *    *  *    *    *    *    *
10  2    *    *  *    *    *    *    *
11  2    *    *  *    *    *    *    *
12  2    *    *  *    *    *    *    *

数据没有任何文件扩展名(如 .csv 或 .txt)。所以第一个问题是如何在R中读取它同时保持数据格式不变。

我尝试使用read.csv(),但它会使第6行变成

SH

将 S 分配到第 1 类而不是第 3 类,将 H 分配到第 2 类而不是第 6 类。最终,我如何生成所需的数据框?

【问题讨论】:

    标签: r csv dplyr


    【解决方案1】:

    试试readLine。它将文件读入字符向量。然后你可以用 "" 分割字符串:

    v1 = readLines("C:/User/Yourfolder/test_text")
    v2 = t(sapply(v1, function(x) {unlist(strsplit(x,""))}))
    rownames(v2) = c(1:length(v1))
    

    输出:

       [,1] [,2] [,3] [,4] [,5] [,6] [,7]
    1  " "  " "  " "  " "  "1"  " "  " " 
    2  "*"  "*"  "*"  "*"  "*"  "*"  "*" 
    3  "*"  "*"  "*"  "*"  "*"  "*"  "*" 
    4  "*"  "*"  "*"  "*"  "*"  "*"  "*" 
    5  "*"  "*"  "*"  "*"  "*"  "*"  "*" 
    6  " "  " "  "S"  " "  " "  "H"  " " 
    7  " "  "H"  "H"  "H"  "H"  "H"  " " 
    8  " "  " "  " "  " "  "2"  " "  " " 
    9  "*"  "*"  "*"  "*"  "*"  "*"  "*" 
    10 "J"  "S"  "H"  " "  " "  " "  "K" 
    11 "*"  "*"  "*"  "*"  "*"  "*"  "*" 
    12 "*"  "*"  "*"  "*"  "*"  "*"  "*" 
    13 "*"  "*"  "*"  "*"  "*"  "*"  "*" 
    

    【讨论】:

    • 此解决方案似乎无法处理 ID。
    【解决方案2】:

    在我看来,您可能正在寻找read.fwf。下面是我使用的方法。当然,您希望摆脱 textConnection 部分并将其替换为您的文件的路径,否则我认为这应该可以工作。

    d <- read.fwf(textConnection(
    "    1  
    *******
    *******
    *******
    *******
      S  H 
     HHHHH 
        2  
    *******
    JSH   K
    *******
    *******
    *******
    *******"), 
        widths = rep(1, 7),
        na = c(" "),
        stringsAsFactors = FALSE)
    
    id <- as.numeric(d[seq(1, nrow(d), 7), 5])
    id <- rep(id, each = 6)
    
    d <- d[seq(1, nrow(d), 7), ]
    d <- cbind(id, d)
    names(d)[-1] <- paste0("a", 1:7)
    d
    
       id   a1   a2   a3   a4   a5   a6   a7
    3   1    *    *    *    *    *    *    *
    4   1    *    *    *    *    *    *    *
    5   1    *    *    *    *    *    *    *
    6   1 <NA> <NA>    S <NA> <NA>    H <NA>
    7   1 <NA>    H    H    H    H    H <NA>
    8   1 <NA> <NA> <NA> <NA>    2 <NA> <NA>
    9   2    *    *    *    *    *    *    *
    10  2    J    S    H <NA> <NA> <NA>    K
    11  2    *    *    *    *    *    *    *
    12  2    *    *    *    *    *    *    *
    13  2    *    *    *    *    *    *    *
    14  2    *    *    *    *    *    *    *
    

    【讨论】:

    • 非常感谢,第一次知道这种文件居然有一个名字叫定宽文件!
    • 没问题,我很高兴它有帮助!
    猜你喜欢
    • 2013-12-09
    • 2018-01-13
    • 2017-11-24
    • 1970-01-01
    • 2011-06-06
    • 2011-08-19
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多