【问题标题】:R: recognizing the number of columns when reading a Data FrameR:读取数据框时识别列数
【发布时间】:2014-01-25 15:58:37
【问题描述】:

当在 R 中输入以下命令时,会创建一个 11 行 5 列(变量)的数据框。我的问题是 R 怎么知道这个数据集中有 5 列?是什么阻止 R 创建 1 行 x 55 列数据框?

谢谢!

d <- read.table(header=FALSE, fill=TRUE, text="
  1   2010-10-04 52495  2010-10-04 11.6  
  2   2010-10-01 53000  2010-10-01 15.3
  3   2010-09-30 52916  2010-09-30 14.3
  4   2010-09-29 52785  2010-09-29 11.3
  5   2010-09-28 53348  2010-09-28 18.2
  6   2010-09-27 52885  2010-09-24 11.7
  7   2010-09-24 52174  2010-09-23 15.0
  8   2010-09-23 51461  2010-09-22 18.6
  9   2010-09-22 51286  2010-09-20 17.9
  10  2010-09-21 50968  
  11  2010-09-20 49250  ")

【问题讨论】:

  • 行尾字符?

标签: r dataframe read.table


【解决方案1】:

函数read.table有几个参数,大部分都有默认值,所以不需要指定。特别是参数sep,默认为""。这个参数是识别列数的神奇参数。如果您将代码更改为:

data.txt="
  1   2010-10-04 52495  2010-10-04 11.6  
  2   2010-10-01 53000  2010-10-01 15.3
  3   2010-09-30 52916  2010-09-30 14.3
  4   2010-09-29 52785  2010-09-29 11.3
  5   2010-09-28 53348  2010-09-28 18.2
  6   2010-09-27 52885  2010-09-24 11.7
  7   2010-09-24 52174  2010-09-23 15.0
  8   2010-09-23 51461  2010-09-22 18.6
  9   2010-09-22 51286  2010-09-20 17.9
  10  2010-09-21 50968  
  11  2010-09-20 49250  "

# reading the same data with different sep values
d0 <- read.table(header=FALSE, fill=TRUE, text=data.txt)
d1 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep="")
d2 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep=",")
d3 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep=";")
d4 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep="-")
d5 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep="0")
d6 <- read.table(header=FALSE, fill=TRUE, text=data.txt, sep=".")

# aggregatting all data frames
d = list(d0=d0, d1=d1, d2=d2, d3=d3, d4=d4, d5=d5, d6=d6)
dims.d = sapply(d, dim) # get the dimension of all dataframes
rownames(dims.d) = c("nrow", "ncol")
print(dims.d)

     d0 d1 d2 d3 d4 d5 d6
nrow 11 11 11 11 11 11 11
ncol  5  5  1  1  5 12  2

现在您看到数据的读取方式有所不同。所有 5 列的数据框都完全不同,但前两个(你可以检查)。为什么总是有 11 行?因为行尾用于指示新行的开始。在没有我们明确干预的情况下,始终查看此默认参数以查看正在发生的事情是一个好主意。

【讨论】:

    【解决方案2】:

    read.table 和朋友们用于读取表格数据,即可以描述为具有一定数量的行和列的输入。该函数从输入中的分隔符和换行符推断行和列,这就是为什么你得到 11 行和 5 列的原因。如果您有顺序输入,即只有一堆没有特定结构的元素,请使用scan

    另一方面,您在该输入中有一个行号,这意味着您确实有表格数据...是吗?

    【讨论】:

      【解决方案3】:

      有 5 列 11 行,所以你应该预料到这一点(不足为奇)。例如,如果你删除了 1,2...11 的第一列,但保留了其他列,然后重新排列日期为一个col 和另一个 col 上的值,那么您将有 20 行和 2 列。

      d <- read.table(header=FALSE, fill=TRUE, text="
                2010-10-04 52495   
                2010-10-01 53000  
                2010-09-30 52916  
                2010-09-29 52785  
                2010-09-28 53348  
                2010-09-27 52885  
                2010-09-24 52174  
                2010-09-23 51461  
                2010-09-22 51286  
                2010-09-21 50968  
                2010-09-20 49250
                2010-10-04 11.6
                2010-10-01 15.3 
                2010-09-30 14.3 
                2010-09-29 11.3 
                2010-09-28 18.2
                2010-09-24 11.7
                2010-09-23 15.0
                2010-09-22 18.6
                2010-09-20 17.9")
      

      如果要创建 1 行乘 43 列,则需要将所有日期和值放在一行中(在脚本文件中)。像这样:

      d <- read.table(header=FALSE, fill=TRUE, text="2010-10-04 52495 2010-10-01 53000 2010 09 30 52916 2010-09-29 52785 2010-09-28 53348 2010-9-27 52885 2010-09-24 52174 2010-09-23 51461  2010-09-22 51286  2010-09-21 50968 2010-09-20 49250 2010-10-04 11.6 2010-10-01 15.3 2010-09-30 14.3 2010-09-29 11.3 2010-09-28 18.2 2010-09-24 11. 2010-09-23 15.0 2010-09-22 18.6 2010-09-20 17.9")
      

      对于 2 行乘 32 列,在脚本中放入 2 行。像这样的:

      d <- read.table(header=FALSE, fill=TRUE, text="2010-10-04 52495 2010-10-01 53000 2010 09 30 52916 2010-09-29 52785 2010-09-28 53348 2010-9-27 52885 2010-09-24 52174 2010-09-23 51461  2010-09-22 51286  2010-09-21 50968 2010-09-20 49250 2010-10-04 11.6 2010-10-01 15.3 2010-09-30 14.3 2010-09-29 11.3
                      2010-09-28 18.2 2010-09-24 11. 2010-09-23 15.0 2010-09-22 18.6 2010-09-20 17.9")
      

      【讨论】:

      • 如果你使用 'sep="."' 你会得到一个完全不同的数据框。问题是 R 如何识别数据的结构,而不是产生改变输入文本的不同输出。
      • 来自您的回答:“为什么总是有 11 行?因为行尾用于指示新行的开始。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2017-04-29
      • 1970-01-01
      相关资源
      最近更新 更多