【问题标题】:row.names=NULL adds a column and shifts the restrow.names=NULL 添加一列并移动其余列
【发布时间】:2020-02-20 22:18:12
【问题描述】:

当我使用阅读 txt 文件时

read.table("text.txt", row.names=NULL, fill=TRUE)

创建了一个名为“row.names”的新列,它接管了预先存在的列的值。所有其余的列都向右移动。

知道发生了什么吗?

我使用 row.names=NULL,因为不添加它会返回错误,即存在重复的行名。

数据链接:https://raw.githubusercontent.com/bcaffo/ds4bme/master/data/federalRegions.txt

更新

这就是我的数据在上面的 read.table 之后的样子:


   row.names        Region     State
1          1   Connecticut          
2          1         Maine          
3          1 Massachusetts          
4          1           New Hampshire
5          1         Rhode    Island
6          1       Vermont          
7          2           New    Jersey
8          2           New      York
9          3      Delaware          
10         3      Maryland          
11         3  Pennsylvania          
12         3      Virginia          
13         3          West  Virginia
14         4       Alabama          
15         4       Florida          
16         4       Georgia          
17         4      Kentucky          
18         4   Mississippi          
19         4         North  Carolina
20         4         South  Carolina
21         4     Tennessee          
22         5      Illinois          
23         5       Indiana          
24         5      Michigan          
25         5     Minnesota          
26         5          Ohio          
27         5     Wisconsin          
28         6      Arkansas          
29         6     Louisiana          
30         6           New    Mexico
31         6      Oklahoma          
32         6         Texas          
33         7          Iowa          
34         7        Kansas          
35         7      Missouri          
36         7      Nebraska          
37         8      Colorado          
38         8       Montana          
39         8         North    Dakota
40         8         South    Dakota
41         8          Utah          
42         8       Wyoming          
43         9       Arizona          
44         9    California          
45         9        Hawaii          
46         9        Nevada          
47        10        Alaska          
48        10         Idaho          
49        10        Oregon          
50        10    Washington  

创建了一个新列“row.names”,取代了“Region”值,Region 现在将状态作为其值,“State”现在具有包含两个单词的状态名称的后半部分。

【问题讨论】:

  • 它抱怨重复行名的事实(当你没有添加row.names=NULL时)表明read.table发现第一行的字段比第二行少一个,这表明第一行line 是所有列标题,所有后续行的第一个字段是行名。如果是这种情况,那么看到重复的行名表明您对数据的假设确实存在错误。建议,使用read.table(..., row.names=NULL)[,-1](假设新列row.names 始终作为第一列,这似乎是正确的)。
  • 或者您可以通过任何其他方式删除它,例如dat[, setdiff(colnames(dat), "row.names")]dplyr::select(day, -row.names)、或subset(aaa, select=-row.names)
  • 我怀疑您可以使用colClasses 告诉它忽略第一列(如果list 并且任何位置明确为NULL,则跳过该列),但它的使用需要您在阅读之前知道列数。重复阅读并不昂贵(尤其是如果您只阅读前几行),但似乎比可能需要的解决方法更多。
  • 底线,我不知道在读入之前或读入时是否有使用read.table 自动省略该列的方法;我怀疑最简单的解决方案是将它们读入一列,然后丢弃该列,就像我的第一条评论一样。
  • @r2evans 感谢您的 cmets。鉴于我在更新中发布的问题,您的建议可能难以实施。如果您有任何建议,我将不胜感激!

标签: r


【解决方案1】:

这是一个制表符分隔的文件,但不幸的是,标题行有一个空格而不是制表符。我们可以用readLines抓取文件,把空格换成tab,用read.delim把它变成数据框:

url <- "https://raw.githubusercontent.com/bcaffo/ds4bme/master/data/federalRegions.txt"
text <- readLines(url)
text[1] <- gsub(" ", "\t", text[1])
df <- read.delim(text = text, header = TRUE, stringsAsFactors = FALSE)

df
#>    Region          State
#> 1       1    Connecticut
#> 2       1          Maine
#> 3       1  Massachusetts
#> 4       1  New Hampshire
#> 5       1   Rhode Island
#> 6       1        Vermont
#> 7       2     New Jersey
#> 8       2       New York
#> 9       3       Delaware
#> 10      3       Maryland
#> 11      3   Pennsylvania
#> 12      3       Virginia
#> 13      3  West Virginia
#> 14      4        Alabama
#> 15      4        Florida
#> 16      4        Georgia
#> 17      4       Kentucky
#> 18      4    Mississippi
#> 19      4 North Carolina
#> 20      4 South Carolina
#> 21      4      Tennessee
#> 22      5       Illinois
#> 23      5        Indiana
#> 24      5       Michigan
#> 25      5      Minnesota
#> 26      5           Ohio
#> 27      5      Wisconsin
#> 28      6       Arkansas
#> 29      6      Louisiana
#> 30      6     New Mexico
#> 31      6       Oklahoma
#> 32      6          Texas
#> 33      7           Iowa
#> 34      7         Kansas
#> 35      7       Missouri
#> 36      7       Nebraska
#> 37      8       Colorado
#> 38      8        Montana
#> 39      8   North Dakota
#> 40      8   South Dakota
#> 41      8           Utah
#> 42      8        Wyoming
#> 43      9        Arizona
#> 44      9     California
#> 45      9         Hawaii
#> 46      9         Nevada
#> 47     10         Alaska
#> 48     10          Idaho
#> 49     10         Oregon
#> 50     10     Washington

reprex package (v0.3.0) 于 2020 年 2 月 20 日创建

【讨论】:

    【解决方案2】:

    正如@AllanCameron 所说,您确实有一个制表符分隔的文件,其中第一行不正确。另一种方法是继续使用read.table,但跳过第一行。

    dat <- read.table("federalRegions.txt", sep="\t", skip=1)
    head(dat)
    #   V1            V2
    # 1  1   Connecticut
    # 2  1         Maine
    # 3  1 Massachusetts
    # 4  1 New Hampshire
    # 5  1  Rhode Island
    # 6  1       Vermont
    

    您必须重命名列,但这并不难。您可以手动/按字面意思或以某种方式通过编程来完成(尽管如果有混合的空格/制表符,这会出现问题)。

    # colnames(dat) <- c("Region", "State") # manually
    colnames(dat) <- strsplit(readLines("federalRegions.txt", n=1), "\\s+")[[1]]
    head(dat)
    #   Region         State
    # 1      1   Connecticut
    # 2      1         Maine
    # 3      1 Massachusetts
    # 4      1 New Hampshire
    # 5      1  Rhode Island
    # 6      1       Vermont
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-01
      • 2014-10-01
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多