在 R 中将列表转换为数字

16
我最近遇到了一个问题,每次读取包含表格值的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)

6
不要在问题中包含答案。将您想要解决的问题写成问题并作为实际答案提交。 - Dason
1
我认为这更适合在您的博客或类似平台发布。正如@Dason所指出的那样,这并不完全符合本网站的问答风格。如果您不确定如何在该网站上发布内容,请查看[faq](http://stackoverflow.com/faq)获取详细信息。很好的尝试,只需要稍微编辑一下将其重新聚焦为问答形式即可。 - Simon O'Hanlon
工作得很好,我很喜欢!这解决了我很多的挫败感。只是我想知道,是否仅使用原始数据框中的行和列名与colnames(dataNum) <- colnames(originalDF)将会让我陷入麻烦,因为它们不匹配。但到目前为止看起来还不错 :) - Sebastian Hesse
1个回答

21

以下提供一种更短/更快的方法将您的数据框转换为数字矩阵:

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"

2
两种方法(原始帖子或下面的答案)都对我无效,所以我仍然无法获得rowSums… - SiKiHe
@SikiHe:这不是一个非常有建设性的评论,您能详细说明一下吗?也许您可以创建自己的问题,并提供可重现的示例,并从此处链接到它... - flodel
我和上面的问题完全一样,所以我认为没有必要创建自己的帖子。我正在导入一个csv文件并尝试获取rowSums,但是收到了一个错误消息,即rowSums的输入必须是数字。我尝试了这里描述的两种方法,但它们都没有起作用。也就是说,要么数字被转换为等级,因此rowSums不正确,因为添加的不是原始数字,要么它们不是数字,根本无法相加。 - SiKiHe
1
请发布您的数据。您必须在某个地方有一些非数字,这会迫使R将整个列(或几列)视为因子。 - flodel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接