【问题标题】:Converting from a list to numeric in R在R中从列表转换为数字
【发布时间】:2013-07-04 14:35:32
【问题描述】:

我最近遇到一个问题,每次我读取包含带有值的表的 csv 文件时,R 都会将其读取为列表格式而不是数字格式。由于没有线程为我的情况提供完整的答案,一旦我能够让它运行,我决定在这里包含对我有用的脚本,希望它对某人有用。在这里,有一些描述和一些选项,以备您需要时使用:

(1) 从 csv 文件中读取数据。这里文件没有头,所以我放F,如果你有头,那就改成T。

data <- read.csv("folder_path/data_file.csv", header=F)

(1.a) 注意:如果您收到一条警告说“readTableHeader 找到不完整的最后一行”,这意味着 R 没有找到文件结尾符号。只需在 csv 文件的末尾添加一个额外的空行,该消息将不会再次显示。

(2) 可以通过mode命令检查数据是否为列表格式(如果是数字,那么你已经准备好了,根本不需要这个过程!)。

mode(data)

(3) 使用数据的维度初始化一个矩阵(如 NA),在其中您需要数字格式的数据。

dataNum <- matrix(data = NA, nrow = dim(data)[1], ncol = dim(data)[2])

(4) 可选:如果您想为列和/或行添加名称,您可以使用这些选项中的一个。

(4a) 为列和行添加名称,假设每个具有相似的信息,换句话说,您希望名称为 col_1, col_2, ... 和 row_1, row_2, ...

colnames(dataNum) <- colnames(dataNum, do.NULL = F, prefix = "col_")
rownames(dataNum) <- rownames(dataNum, do.NULL = F, prefix = "row_")

(4b) 如果您希望每列和每行使用不同的名称,请改用此选项并手动添加所有名称。

colnames(dataNum) <- c("col_name_1", "col_name_2")
rownames(dataNum) <- c("row_name_1", "row_name_2")

(5)将数据从列表转化为数值形式,放入矩阵dataNum中。

for (i in 1:dim(data)[2]) {
    dataNum[,i] <- c(as.numeric(data[[i]]))
}

(6) 可以用mode命令检查矩阵是否为数字格式。

mode(dataNum)

(7) 可选:如果您想转置矩阵,可以使用以下指令。

dataNum <- t(dataNum)

【问题讨论】:

  • 不要在问题中包含答案。将您想要解决的问题写成问题,并将答案作为实际答案提交......
  • 我认为这可能更适合您的博客或类似内容。正如@Dason 指出的那样,这并不真正符合本网站的问答风格。如果不确定如何在网站上发布,请查看faq 了解详细信息。虽然努力,但只需稍作编辑即可将其重新定位为问答。
  • 工作,我喜欢它!这只是解决了我很多挫折。只有我想知道是否仅将原始 df 中的行和 colnames 与 colnames(dataNum)

标签: r list matrix numeric


【解决方案1】:

这是一种将 data.frame 转换为数字矩阵的更短/更快的方法:

data <- data.matrix(data)

还有

data <- as.matrix(data)

但一个重要的区别是您的数据是否包含因子或字符列:as.matrix 会将所有内容强制转换为字符矩阵,而 data.matrix 将始终返回 numericinteger 矩阵。

data <- data.frame(
  logical   = as.logical(c(TRUE, FALSE)),
  integer   = as.integer(c(TRUE, FALSE)),
  numeric   = as.numeric(c(TRUE, FALSE)),
  factor    = as.character(c(TRUE, FALSE))
)

data.matrix(data)
#      logical integer numeric factor
# [1,]       1       1       1      2
# [2,]       0       0       0      1

as.matrix(data)
#      logical integer numeric factor 
# [1,] " TRUE" "1"     "1"     "TRUE" 
# [2,] "FALSE" "0"     "0"     "FALSE"

【讨论】:

  • 这两种方法(原始帖子或下面的答案)都不适合我,所以我仍然无法获得 rowSums...
  • @SikiHe:不是很有建设性的评论,你能详细说明一下吗?也许用一个可重复的例子创建你自己的问题并从这里链接到它......
  • 我遇到了和上面一样的问题,这就是为什么我认为没有必要创建自己的帖子。我正在导入一个 csv 文件并尝试获取 rowSums,但收到一条错误消息,指出 rowSums 的输入必须是数字。我尝试了这里描述的两种方法,但都没有奏效。也就是说,要么数字被转换为等级,因此 rowSums 不正确,因为它不是添加的原始数字,或者它们不是数字并且一开始就无法添加。
  • 请发布您的数据。您必须有一些非数字的地方迫使 R 将整个列视为一个因素。
猜你喜欢
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2022-01-18
  • 2019-04-14
  • 1970-01-01
  • 2019-09-16
相关资源
最近更新 更多