5.2 通过键盘和剪贴板把数据载入并保存到 R

5.2.1 问题

你想用键盘输入数据,而不是从文件中载入。

5.2.2 方案

5.2.2.1 数据输入

假如你的数据如下:

  1. size weight cost
  2. small 5 6
  3. medium 8 10
  4. large 11 9
5.2.2.1.1 通过键盘输入或从剪贴板载入数据

从键盘上输入的方法之一是从标准输入读取( stdin() )。

  1. # 使用 read.table 和 stdin() 剪切和粘贴
  2. data <- read.table(stdin(), header=TRUE)
  3. # 系统将提示您输入:在这复制和粘贴文本
  4. # 或者:
  5. # data <- read.csv(stdin())

你也可以直接从剪贴板载入:

  1. # 首先将数据复制到剪贴板
  2. data <- read.table('clipboard', header=TRUE)
  3. # 或者:
  4. # data <- read.csv('clipboard')
5.2.2.1.2 在脚本中载入数据

前面的方法不能用来加载脚本文件中的数据,因为输入(通过键入或粘贴)必须发生在运行该命令之后。

  1. # 使用 read.table()
  2. data <- read.table(header = TRUE, text = "
  3. size weight cost
  4. small 5 6
  5. medium 8 10
  6. large 11 9
  7. ")

不同的数据格式(如:以逗号分隔,没有表头,等等),选择 read.table() 可以设置。

阅读R载入文件中的数据查看更多信息。

5.2.2.2 数据输出

默认情况下,R 会打印行名称。当你希望打印出来的表格可以被复制粘贴,那么最好将这一设定关闭。

  1. print(data, row.names = FALSE)
  2. #> size weight cost
  3. #> small 5 6
  4. #> medium 8 10
  5. #> large 11 9
5.2.2.2.1 写入可以复制粘贴或粘贴到剪贴板的数据

可以将带分隔符的数据写入终端( stdout() ),这样它就可以被复制粘贴到其他地方,也可以直接写入到剪贴板。

  1. write.csv(data, stdout(), row.names=FALSE)
  2. # "size","weight","cost"
  3. # "small",5,6
  4. # "medium",8,10
  5. # "large",11,9
  6. # 写到剪贴板(不支持 Mac 或 Unix)
  7. write.csv(data, 'clipboard', row.names=FALSE)
5.2.2.2.2 输出 R 中的载入数据

如果数据已经加载到 R,可以使用 dput() 保存数据。通过 dput() 得到的输出是一个命令,可以重建数据结构。这种方法的优点是,它可以保持各种数据类型的修改。举个例子,如果有一列包含各种数字的数据,并且你已经将这一列转化成了因子。这种方法将会在保留该数据类型的同时,只加载文本表格(如上所示)并将把它处理为数字。

  1. # 假如你已经载入数据
  2. dput(data)
  3. #> structure(list(size = structure(c(3L, 2L, 1L), .Label = c("large",
  4. #> "medium", "small"), class = "factor"), weight = c(5L, 8L, 11L
  5. #> ), cost = c(6L, 10L, 9L)), .Names = c("size", "weight", "cost"
  6. #> ), class = "data.frame", row.names = c(NA, -3L))
  7. # 之后,我们可以使用 dput 中输出,重新创建数据结构
  8. newdata <- structure(list(size = structure(c(3L, 2L, 1L), .Label = c("large",
  9. "medium", "small"), class = "factor"), weight = c(5L, 8L, 11L
  10. ), cost = c(6L, 10L, 9L)), .Names = c("size", "weight", "cost"
  11. ), class = "data.frame", row.names = c(NA, -3L))