【问题标题】:How to adjust separator to be multiple spaces rather than single space to read dataframe into r?如何将分隔符调整为多个空格而不是单个空格以将数据帧读入 r?
【发布时间】:2021-01-21 17:01:24
【问题描述】:

我需要将下表读入R。此表是 prop.table(table(x,y),2) 的输出。 问题出在 sep ="\t" 中。我试过sep =""sep =c("\t","") 但它们都没有像某些 行也有空间。

我尝试了以下代码:

dataMonthlyTrend<-read.table(text= " Variable Non_stopped_percentage stopped_percentage
INDIV                                  1.0000000       0.0000000000
INDUSTRY                               0.9987045       0.0012955466
NETWORK                                0.9990512       0.0009487666
OTHER                                  0.9997127       0.0002872679
Early Phase 1                          0.9981618       0.0018382353
Not.Applicable                         0.9996305       0.0003694809
Phase.1                                0.9993608       0.0006392499
Phase 1, Phase 2                       1.0000000       0.0000000000
Phase.2                                0.9990993       0.0009006980
Phase.2, Phase 3                       0.9990329       0.0009671180
Phase 3                                0.9991403       0.0008596974
Phase 4                                0.9995730       0.0004269855
Observational                          0.9997154       0.0002846084
Expanded Access                        1.0000000       0.0000000000
Interventional                         0.9994374       0.0005625766
Behavioral                             0.9998005       0.0001994813
Biological                             0.9995493       0.0004506534
Combination Product                    1.0000000       0.0000000000
Device                                 0.9991869       0.0008131403
Diagnostic Test                        1.0000000       0.0000000000
More than 1 type                       0.9992554       0.0007446016
Other                                  0.9996144       0.0003855546
Procedure                              1.0000000       0.0000000000
Radiation                              1.0000000       0.0000000000
Case-Control                           0.9996120       0.0003880481
Case-Crossover                         1.0000000       0.0000000000
Case-Only                              0.9996069       0.0003930818
Cohort                                 0.9996924       0.0003075977
Defined Population                     1.0000000       0.0000000000
Ecologic or Community                  1.0000000       0.0000000000
Family-Based                           1.0000000       0.0000000000
Natural History                        1.0000000       0.0000000000
Other                                  1.0000000       0.0000000000
Non-Probability Sample                 0.9997578       0.0002422481
Africa                                 1.0000000       0.0000000000
Asia                                   0.9998925       0.0001075038
Europe                                 0.9998773       0.0001227220
More than 1 continent                  0.9998412       0.0001587554
North America                          0.9994576       0.0005423974
Oceania                                0.9969970       0.0030030030
South America                          1.0000000       0.0000000000
", sep="\t", header=T);dataMonthlyTrend

这就是我使用之前的代码得到的结果

然后我使用下面屏幕截图中显示的这段代码,虽然我按照@G.Grothendiec 的代码输入了列标题,但没有列标题

我当前的 R 版本是 3.6.2 (2019-12-12)。

任何建议将不胜感激。

【问题讨论】:

    标签: r dataframe matrix


    【解决方案1】:

    1) read.table 假设Lines 显示在最后的注释中,然后用分号替换多个空格字符,给出L。然后读取L除了header,在header中分别读取设置col.names

    L <- gsub("\\s{2,}", ";", Lines)
    DF <- read.table(text = L, sep = ";", skip = 1, strip.white = TRUE,
      col.names = read.table(text = L, nrow = 1))
    

    结果如下:

    > str(DF)
    'data.frame':   41 obs. of  3 variables:
     $ Variable              : chr  "INDIV" "INDUSTRY" "NETWORK" "OTHER" ...
     $ Non_stopped_percentage: num  1 0.999 0.999 1 0.998 ...
     $ stopped_percentage    : num  0 0.001296 0.000949 0.000287 0.001838 ...
    

    2) 读取.pattern

    另一种方法是使用 gsubfn 包中的 read.pattern。这可以一次完成,而不需要单独的步骤来替换分隔符。

    library(gsubfn)
    DF <- read.pattern(text = Lines, pattern = "^(.*)\\s+(\\S+)\\s+(\\S+)$", 
      skip = 1, col.names = read.table(text = Lines, nrow = 1))
    

    注意

    Lines <- " Variable Non_stopped_percentage stopped_percentage
    INDIV                                  1.0000000       0.0000000000
    INDUSTRY                               0.9987045       0.0012955466
    NETWORK                                0.9990512       0.0009487666
    OTHER                                  0.9997127       0.0002872679
    Early Phase 1                          0.9981618       0.0018382353
    Not.Applicable                         0.9996305       0.0003694809
    Phase.1                                0.9993608       0.0006392499
    Phase 1, Phase 2                       1.0000000       0.0000000000
    Phase.2                                0.9990993       0.0009006980
    Phase.2, Phase 3                       0.9990329       0.0009671180
    Phase 3                                0.9991403       0.0008596974
    Phase 4                                0.9995730       0.0004269855
    Observational                          0.9997154       0.0002846084
    Expanded Access                        1.0000000       0.0000000000
    Interventional                         0.9994374       0.0005625766
    Behavioral                             0.9998005       0.0001994813
    Biological                             0.9995493       0.0004506534
    Combination Product                    1.0000000       0.0000000000
    Device                                 0.9991869       0.0008131403
    Diagnostic Test                        1.0000000       0.0000000000
    More than 1 type                       0.9992554       0.0007446016
    Other                                  0.9996144       0.0003855546
    Procedure                              1.0000000       0.0000000000
    Radiation                              1.0000000       0.0000000000
    Case-Control                           0.9996120       0.0003880481
    Case-Crossover                         1.0000000       0.0000000000
    Case-Only                              0.9996069       0.0003930818
    Cohort                                 0.9996924       0.0003075977
    Defined Population                     1.0000000       0.0000000000
    Ecologic or Community                  1.0000000       0.0000000000
    Family-Based                           1.0000000       0.0000000000
    Natural History                        1.0000000       0.0000000000
    Other                                  1.0000000       0.0000000000
    Non-Probability Sample                 0.9997578       0.0002422481
    Africa                                 1.0000000       0.0000000000
    Asia                                   0.9998925       0.0001075038
    Europe                                 0.9998773       0.0001227220
    More than 1 continent                  0.9998412       0.0001587554
    North America                          0.9994576       0.0005423974
    Oceania                                0.9969970       0.0030030030
    South America                          1.0000000       0.0000000000
    "
    

    【讨论】:

    • 感谢您的宝贵意见。我完全按照您的说法使用了您的代码,但缺少标题。请让我知道我是否应该编辑其中的内容。赞成。
    • 显示的代码也会读取标题。从输出中可以看出。
    • 谢谢。我明白了,但我不确定为什么即使在使用第二种方法后它也没有显示出来。这是使用'str(DF)''data.frame'的输出:41 obs。 3 个变量:$ X1:因子 w/ 40 个级别“非洲”,“亚洲”,..:18 19 24 31 13 27 35 32 36 37 ... $ X1.1:num 1 0.999 0.999 1 0.998 ... $ X1.2:数字 0 0.001296 0.000949 0.000287 0.001838 ...
    • 这两种方法都适用于Lines。第二种方法不是由于第一种方法的任何缺陷。这只是另一种选择。据推测,您的数据与您在问题中显示的数据之间存在一些差异。请显示前几行以更好地理解差异。
    • 你也在使用旧版本的 R 吗? read.table 不会产生 R 4.0+ 的因子输出。
    【解决方案2】:

    read.table 函数(和其他类似函数)只允许 sep 成为要匹配的字符,而不是正则表达式,这正是您所需要的。

    因此,一种方法是将您的数据放入一个字符串,然后对其进行预处理以更改分隔符,然后将该结果传递给read.table(如果从文件中读取,您可以使用readLines 读入一个用于预处理的字符向量。

    这里有一些代码可以完成您所描述的大部分内容(我缩短了数据):

    text.data <- " Variable Non_stopped_percentage stopped_percentage
    INDIV                                  1.0000000       0.0000000000
    INDUSTRY                               0.9987045       0.0012955466
    South America                          1.0000000       0.0000000000"
    
    text.data2 <- gsub("[[:space:]]{2,}|\\t", ":", text.data)
    read.table(text=text.data2, sep=':', skip=1)
    

    这里我将数据存储在text.data 中,然后使用gsub 替换两个或多个空格字符的模式或用冒号替换单个制表符(可以使用其他分隔符,但冒号是一个尚未在数据中)。然后将处理后的数据通过sep=':' 传递给read.table。我跳过了第一行,因为第一行(列名)由一个空格分隔(并且在开头有一个额外的空格),因此您需要在一个额外的步骤中设置名称。

    但是,由于这是来自 prop.table 的输出,因此最好只保存 prop.table 的结果,而不是打印结果并将它们复制并粘贴到其他代码中。

    【讨论】:

      猜你喜欢
      • 2020-02-23
      • 2012-12-29
      • 1970-01-01
      • 2013-01-16
      • 2021-01-28
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多