【问题标题】:exporting matrix from r to csv file with only matrix entries将矩阵从 r 导出到仅包含矩阵条目的 csv 文件
【发布时间】:2018-08-11 12:40:25
【问题描述】:

这是r中的矩阵A:

          [,1]         [,2]         [,3]            [,4]    
[1,]   0.69036059      0.02021414   0.0006167409     0.0000000000   
[2,]   0.23268734      0.67640555   0.0202016684     0.0006167409    
[3,]   0.06068696      0.22798377   0.6759883802     0.0202016684    
[4,]   0.01307434      0.05946023   0.2278431604     0.6759883802

用于导出此矩阵的代码:write.csv(A1,"ProbMatrix.csv")

csv 文件中的结果:

        V1               V2          V3               V4
1   0.69036059      0.02021414   0.0006167409     0.0000000000
2   0.23268734      0.67640555   0.0202016684     0.0006167409
3   0.06068696      0.22798377   0.6759883802     0.0202016684
4   0.01307434      0.05946023   0.2278431604     0.6759883802

这不是我想要的,我只是想要数字

0.69036059   0.02021414   0.0006167409   0.0000000000
0.23268734   0.67640555   0.0202016684   0.0006167409
0.06068696   0.22798377   0.6759883802   0.0202016684
0.01307434   0.05946023   0.2278431604   0.6759883802

我尝试在导出之前删除行和列,我尝试在 write.csv 代码中包含 row.names=Falsecol.names=FALSE 参数,但没有一个给我想要的结果。

我该如何解决这个问题?

【问题讨论】:

  • 如果您使用write.table,它可能会起作用。

标签: r csv


【解决方案1】:

在 write.table 函数中有一个选项来指示列名和/或不导出名称:相应的 row.names = F 和/或 col.names = F。默认值为 TRUE(表示导出名称),除非您在命令中将其指定为 FALSE:

write.table(A, file="file.csv", row.names = F, col.names = F)

【讨论】:

  • 您好 Nar,您能否解释一下您认为这段代码如何回答问题? - 来自审查队列
【解决方案2】:

这里的问题是 R 在将 csv 文件读回 R 环境时如何处理它们。如果您使用 write.table(...row.names = FALSE, col.names = FALSE) 将矩阵保存到 csv 文件中,它将写入矩阵而不添加列名。但是当您使用 read.table()read.csv() 将文件读回 R 环境时会出现问题,因为这些函数将文件读回 data.frame 而不是 matrix 类型的对象。

让我在这里说明一下。

data_set <- c(0.69036059, 0.02021414, 0.0006167409, 0.0000000000, 0.23268734, 
              0.67640555, 0.0202016684, 0.0006167409, 0.06068696, 0.22798377,
              0.6759883802, 0.0202016684, 0.01307434, 0.05946023, 0.2278431604 , 
              0.6759883802)

test_matrix <- matrix(data = data_set, nrow = 4, ncol = 4)

# Look at the type of the object
str(test_matrix)
num [1:4, 1:4] 0.690361 0.020214 0.000617 0 0.232687 ...

write.table(x = test_matrix,file = "test.csv", sep = ',', 
                              row.names = FALSE, col.names = FALSE)

csv file has no column names(headers) added to it

test_object <- read.table(file = "test.csv", header = FALSE, sep = ',')

str(test_object)
'data.frame':   4 obs. of  4 variables:
 $ V1: num  0.690361 0.020214 0.000617 0
 $ V2: num  0.232687 0.676406 0.020202 0.000617
 $ V3: num  0.0607 0.228 0.676 0.0202
 $ V4: num  0.0131 0.0595 0.2278 0.676

因此,在将其读回 R 时,它会将 csv 中的数据作为 data.frame 对象读取。如果没有为数据框指定列名,则会自动创建它们。我认为这就是这里的问题。

即使我们使用 readr 包中的 read_csv 函数,同样的问题仍然存在。

library(readr)

test_object <- read_csv("test.csv", col_names = FALSE)

str(test_object)

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   4 obs. of  4 variables:
 $ X1: num  0.690361 0.020214 0.000617 0
 $ X2: num  0.232687 0.676406 0.020202 0.000617
 $ X3: num  0.0607 0.228 0.676 0.0202
 $ X4: num  0.0131 0.0595 0.2278 0.676
 - attr(*, "spec")=List of 2
  ..$ cols   :List of 4
  .. ..$ X1: list()
  .. .. ..- attr(*, "class")= chr  "collector_double" "collector"
  .. ..$ X2: list()
  .. .. ..- attr(*, "class")= chr  "collector_double" "collector"
  .. ..$ X3: list()
  .. .. ..- attr(*, "class")= chr  "collector_double" "collector"
  .. ..$ X4: list()
  .. .. ..- attr(*, "class")= chr  "collector_double" "collector"
  ..$ default: list()
  .. ..- attr(*, "class")= chr  "collector_guess" "collector"
  ..- attr(*, "class")= chr "col_spec"

我认为一种可能的解决方案是将对象保存/写入.RData 文件中。您可以在这个问题中找到更多信息 - R save Matrix to csv, and load as Matrix

【讨论】:

  • 感谢您的指示,添加参数 row.names=F 和 col.names=F 并没有帮助抑制 V1、V2、...... 在 R 中读回它是不是真正的问题,您只需说 header=T,然后根据需要更改列名。不过,我会再次考虑您的所有建议并尝试它们。非常感谢!
猜你喜欢
  • 2015-10-18
  • 2014-08-17
  • 2021-05-24
  • 1970-01-01
  • 2019-01-04
  • 2017-08-24
  • 1970-01-01
  • 2017-03-20
  • 2015-12-30
相关资源
最近更新 更多