【问题标题】:Save a data.frame of a list as a csv file in R将列表的 data.frame 保存为 R 中的 csv 文件
【发布时间】:2020-04-24 10:55:09
【问题描述】:

我有一个名为output 的对象,它属于data.frame 类,包含一个列表。我想知道是否可以将 output 保存为 R 中的 csv 文件?

这是我的代码:

d <- data.frame(list(A = c(kap = 2, sap = 3), B = c(kap = 1, sap = 4)))

d[] <- lapply(d, as.list)  ## This step is required to show `TRUE` and `FALSE` in `output`

output <- data.frame(t(d), dap = c(T, F))

write.csv(output, "output.csv") # Error: unimplemented type 'list' in 'EncodeElement'

【问题讨论】:

  • output 是列的list。你想要这样吗?
  • 你可以试试:data.table::fwrite(output, file = "output.csv"),而不是write.csv
  • 您可能需要output &lt;- data.frame(lapply(output, unlist))
  • 另外,你不能在第一次初始化 'd 后做 d &lt;- data.frame(list(A = c(kap = 2, sap = 3), B = c(kap = 1, sap = 4)));data.frame(t(d), dap = c(TRUE, FALSE))

标签: r list function csv dataframe


【解决方案1】:

如果我们可以在转置“d”后创建data.frame,那么它也应该可以工作

output <-  data.frame(t(d), dap = c(TRUE, FALSE))
row.names(output) <- NULL

第二行代码中的lapply 循环遍历列,然后应用as.list,即它创建了lists 的list

lapply(d, as.list)
#$A
#$A[[1]]
#[1] 2

#$A[[2]]
#[1] 3


#$B
#$B[[1]]
#[1] 1

#$B[[2]]
#[1] 4

当我们将其分配给 'd' 并保持相同的结构 ([]) 时,它将保留为 data.frame 和 list 列

d[] <- lapply(d, as.list) 
str(d)
#'data.frame':  2 obs. of  2 variables:
# $ A:List of 2  # each column is a `list`
#  ..$ : num 2
#  ..$ : num 3
# $ B:List of 2
#  ..$ : num 1
#  ..$ : num 4

现在,我们正在做rbind

rbind(d, dap = c(T, F))
#      A     B
#kap    2     1
#sap    3     4
#dap TRUE FALSE

及其转置,

output <-  t(rbind(d, dap = c(T, F)))
output
#  kap sap dap  
#A 2   3   TRUE 
#B 1   4   FALSE

这可能看起来像一个常规的 data.frame 输出,但它不是

str(output)
#List of 6
# $ : num 2
# $ : num 1
# $ : num 3
# $ : num 4
# $ : logi TRUE
# $ : logi FALSE
# - attr(*, "dim")= int [1:2] 2 3
# - attr(*, "dimnames")=List of 2
#  ..$ : chr [1:2] "A" "B"
#  ..$ : chr [1:3] "kap" "sap" "dap"

再次被data.frame包裹

str(data.frame(output))
#'data.frame':  2 obs. of  3 variables:
# $ kap:List of 2
#  ..$ A: num 2
#  ..$ B: num 1
# $ sap:List of 2
#  ..$ A: num 3
#  ..$ B: num 4
# $ dap:List of 2
#  ..$ A: logi TRUE
#  ..$ B: logi FALSE

仍然是带有list 列的data.frame。一种选择是遍历list、unlist 和list 列并用data.frame 包裹

数据

d <- data.frame(list(A = c(kap = 2, sap = 3), B = c(kap = 1, sap = 4)))

【讨论】:

    【解决方案2】:

    发生这种情况是因为数据框的某些列不是列,而是列表类型,您可以通过取消嵌套数据来解决此问题;

    您可以通过以下两种方式进行操作;

    # Creating data
    d <- data.frame(list(A = c(kap = 2, sap = 3), B = c(kap = 1, sap = 4)))
    d[] <- lapply(d, as.list)  ## This step is required to show `TRUE` and `FALSE` in `output`
    
    # Method one using dplyr (Recommended)
    output <- dplyr::tibble(t(rbind(d, dap = c(T, F))))
    
    # Method two unnesting data using tidyr
    output <- tidyr::unnest(data.frame(t(rbind(d, dap = c(T, F)))))
    
    # Output the data
    write.csv(output, "output.csv")
    

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 2020-12-18
      • 1970-01-01
      • 2022-01-17
      • 2023-03-23
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多