5.1 R载入文件中的数据

5.1.1 问题

你想从文件中载入数据。

5.1.2 方案

5.1.2.1 带分隔符的文本文件

最简单的输入数据的方式就是将其保存为带分隔符(如:制表位或逗号)的文本文件。

  1. data <- read.csv("datafile.csv")
  2. # 导入一个没有表头的 CSV 文件
  3. data <- read.csv("datafile-noheader.csv", header=FALSE)

函数 read.table() 是一个更为常用的函数。它允许你设置分隔符,不管该文件是否有表头或者字符串是否有引号,等等。使用 ?read.table 查看更多详细信息。

  1. data <- read.table("datafile-noheader.csv",
  2. header=FALSE,
  3. sep="," # 制表位分隔的文件用 "\t"
  4. )

5.1.2.2 打开文件的文件选择器

有些平台可以使用 file.choose() 命令打开文件选择的对话窗口;而另一些平台则只会提示用户输入一个文件名。

  1. data <- read.csv(file.choose())

5.1.2.3 把字符串看作因子(factor)或字符(character)

默认条件下,数据中的字符串都被转换为因子。如果你用 read.csv() 载入数据,所有的文本列都会被视为因子,而实际上某些文本列被处理为字符串才更为合理。要实现这一点,可以设定 stringsAsFactors=FALSE:

  1. data <- read.csv("datafile.csv", stringsAsFactors=FALSE)
  2. # 将某一列转化为因子
  3. data$Sex <- factor(data$Sex)

另一种将全部文本列加载为因子,再把其中一些转换为字符的方法:

  1. data <- read.csv("datafile.csv")
  2. data$First <- as.character(data$First)
  3. data$Last <- as.character(data$Last)
  4. # 另一种方法:转化名为 “First” 和 “Last” 的两列
  5. stringcols <- c("First","Last")
  6. data[stringcols] <- lapply(data[stringcols], as.character)

5.1.2.4 从网上导入文件

也可以从 URL 加载数据。下面这些(很长的) URL 可以描述了将要加载的相关文件。

  1. data <- read.csv("http://www.cookbook-r.com/Data_input_and_output/Loading_data_from_a_file/datafile.csv")
  2. # 读取没有表头的 CSV 文件
  3. data <- read.csv("http://www.cookbook-r.com/Data_input_and_output/Loading_data_from_a_file/datafile-noheader.csv",
  4. header = FALSE)
  5. # 手动添加表头
  6. names(data) <- c("First", "Last", "Sex", "Number")

上述所使用的数据文件及内容:

  1. "First","Last","Sex","Number"
  2. "Currer","Bell","F",2
  3. "Dr.","Seuss","M",49
  4. "","Student",NA,21
  1. "Currer","Bell","F",2
  2. "Dr.","Seuss","M",49
  3. "","Student",NA,21

5.1.2.5 定宽文本文件

假如你的数据列宽固定,如下:

  1. First Last Sex Number
  2. Currer Bell F 2
  3. Dr. Seuss M 49
  4. "" Student NA 21

读取这种数据的一种方式是简单地使用 read.table() 函数 strip.white=TRUE,可以清除额外的空格。

  1. read.table("clipboard", header=TRUE, strip.white=TRUE)

然而,数据文件里的某些列可能含有空格,也可能不包含空格。比如说下面的数据里,scores 列表示六个不同的测量值,每一个从 0 到 3 。

  1. subject sex scores
  2. N 1 M 113311
  3. NE 2 F 112231
  4. S 3 F 111221
  5. W 4 M 011002

这种情况,你可能需要使用 read.fwf() 函数。如果你读的列名来自于文件,按照要求它们需要用分隔符(如:制表位,空格,逗号)分开。如果它们之间是通过多个空格来隔开的(如下例),你需要直接指定列的名称。

  1. # 指定列的名称
  2. read.fwf("myfile.txt",
  3. c(7,5,-2,1,1,1,1,1,1), # 列的宽度,-2意味着放弃这些列
  4. skip=1, # 跳过第一行(包括表头)
  5. col.names=c("subject","sex","s1","s2","s3","s4","s5","s6"),
  6. strip.white=TRUE) # 跳过每个数据的前导和尾随空格
  7. #> subject sex s1 s2 s3 s4 s5 s6
  8. #> 1 N 1 M 1 1 3 3 1 1
  9. #> 2 NE 2 F 1 1 2 2 3 1
  10. #> 3 S 3 F 1 1 1 2 2 1
  11. #> 4 W 4 M 0 1 1 0 0 2
  12. # subject sex s1 s2 s3 s4 s5 s6
  13. # N 1 M 1 1 3 3 1 1
  14. # NE 2 F 1 1 2 2 3 1
  15. # S 3 F 1 1 1 2 2 1
  16. # W 4 M 0 1 1 0 0 2
  17. # 如果第一行如下:
  18. # subject,sex,scores
  19. # 我们可以使用 header=TRUE
  20. read.fwf("myfile.txt", c(7,5,-2,1,1,1,1,1,1), header=TRUE, strip.white=TRUE)
  21. #> Error in read.table(file = FILE, header = header, sep = sep, row.names = row.names, : more columns than column names
  22. # 错误:列数比列名数量多

5.1.2.6 Excel 文件

gdata 包里的 read.xls() 函数可以读取 Excel 文件。

  1. library(gdata)
  2. data <- read.xls("data.xls")

gdata 包使用说明见 http://cran.r-project.org/doc/manuals/R-data.html#Reading-Excel-spreadsheets

包的安装,见安装和使用R包

5.1.2.7 SPSS 数据

foreign 包里的 read.spss() 函数可以读取 SPSS 文件。

  1. library(foreign)
  2. data <- read.spss("data.sav", to.data.frame=TRUE)