csv 将包含列表的R矩阵转换为包含嵌套列表的R矩阵

oprakyz7  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(166)

我没有太多的经验与R和希望在修改矩阵或 Dataframe 一些帮助。我有一个csv文件,看起来如下:
| | 米1|平方米|立方米|平方米|五月|
| - ------|- ------|- ------|- ------|- ------|- ------|
| c1|1个|无|不适用|1个|无|
| c2|无|无|1个|1个|不适用|
| c3|1个|1个|1个|1个|1个|
| 四碳|无|1个|无|不适用|1个|
我使用以下代码将csv文件读入矩阵:

data <- read.csv(‘file.csv’, sep=“\t”, stringsAsFactors = F,head = T, row.names = 1)`enter code here`
data <- as.matrix(data)
str(data)

执行str(data)后,我得到以下输出:

int [1:4, 1:5] 1 0 1 NA 1 0 ...
 - attr(*, “dimnames”)=List of 2
     ..$ : chr [1:4] “c1” “c2" “c3” “c4" ...
     ..$ : chr [1:5] “m1” “m2" “m3” “m4" ...

在阅读csv之后,我想要得到一个矩阵或 Dataframe (无论哪一个都可以很容易地保存到Rdata中),其中每行作为一个单独的列表,每行的列值作为行列表中的一个列表。

List of 4
$ 1st list: int[1, 1:5] 1 0 NA ...
    ..-attr(*, "dimnames")=List of 2
      .. ..$ : chr [1] “c1”
      .. ..$ : chr [1:5] “m1” “m2" “m3” “m4" ...

$ 2nd list: int[1, 1:5] 1 0 NA ...
    ..-attr(*, "dimnames")=List of 2
      .. ..$ : chr [1] “c1”
      .. ..$ : chr [1:5] “m1” “m2" “m3” “m4" ...

$ 3rd list: int[1, 1:5] 1 0 NA ...
    ..-attr(*, "dimnames")=List of 2
      .. ..$ : chr [1] “c1”
      .. ..$ : chr [1:5] “m1” “m2" “m3” “m4" ...

$ 4th list: int[1, 1:5] 1 0 NA ...
    ..-attr(*, "dimnames")=List of 2
      .. ..$ : chr [1] “c1”
      .. ..$ : chr [1:5] “m1” “m2" “m3” “m4" ...

我知道有很多方法可以得到这个。它可以是在阅读csv的时候,也可以是在将它转换成矩阵并基于行索引创建嵌套列表之后。如果我能用基于行索引的第二种方法得到它,那将非常有帮助。我想将输出的4个列表保存到最终矩阵或 Dataframe 的RData中。

编辑:包括解决方案

我可以使用下面的代码将 Dataframe 拆分为每一行,如@user20650所建议的:

data_new <- split.data.frame(data, row.names(data))

这创建了4个列表,就像我想要的那样。我还发现,如果我们想将 Dataframe 拆分成所需的行数,我们可以使用列索引来实现。最后,我们可以将拆分后的 Dataframe 合并成一个 Dataframe 作为列表,并获得类似的输出。以下是代码:

data_frame_1 <- data[1:2,]
data_frame_2 <- data[3:4,]
df_list <- list("T1" = data_frame_1,"T2" = data_frame_2)

最终的 Dataframe df_list str(df_list)如下所示:

List of 2
 $ T1: int [1:2, 1:5] 1 0 NA 1 0 1 0 ...
    ..- attr(*, "dimnames")=List of 2
      .. ..$ : chr [1:2] "c1" "c2"
      .. ..$ : chr [1:6] "m1" "m2" "m3" "m4" ...

 $ T2: int [1:2, 1:5] 1 0 1 NA 0 1 0 1 NA 1 ...
    ..- attr(*, "dimnames")=List of 2
      .. ..$ : chr [1:2] "c3" "c4"
      .. ..$ : chr [1:6] "m1" "m2" "m3" "m4" ...
ar7v8xwq

ar7v8xwq1#

您可能希望使用drop=FALSE来防止单行自动强制为向量。

res <- lapply(seq_len(nrow(dat)), \(i) dat[i,, drop=FALSE])

str(res)
# List of 4
# $ : int [1, 1:5] 1 0 NA 1 0
# ..- attr(*, "dimnames")=List of 2
# .. ..$ : chr "c1"
# .. ..$ : chr [1:5] "m1" "m2" "m3" "m4" ...
# $ : int [1, 1:5] 0 0 1 1 NA
# ..- attr(*, "dimnames")=List of 2
# .. ..$ : chr "c2"
# .. ..$ : chr [1:5] "m1" "m2" "m3" "m4" ...
# $ : int [1, 1:5] 1 1 1 1 1
# ..- attr(*, "dimnames")=List of 2
# .. ..$ : chr "c3"
# .. ..$ : chr [1:5] "m1" "m2" "m3" "m4" ...
# $ : int [1, 1:5] 0 1 0 NA 1
# ..- attr(*, "dimnames")=List of 2
# .. ..$ : chr "c4"
# .. ..$ : chr [1:5] "m1" "m2" "m3" "m4" ...
  • 数据:*
dat <- structure(c(1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, NA, 1L, 1L, 0L, 1L, 
1L, 1L, NA, 0L, NA, 1L, 1L), dim = 4:5, dimnames = list(c("c1", 
"c2", "c3", "c4"), c("m1", "m2", "m3", "m4", "m5")))
mrfwxfqh

mrfwxfqh2#

下面是从 Dataframe 创建列表列表的代码:

data <- read.table(text = "m1   m2  m3  m4  m5
c1  1   0   NA  1   0
c2  0   0   1   1   NA
c3  1   1   1   1   1
c4  0   1   0   NA  1", header = TRUE, sep = "\t", stringsAsFactors = FALSE)

lst <- lapply(1:nrow(data), function(i) {
  as.list(data[i, ])
})
names(lst) <- data[, 1]
lst

相关问题