【问题标题】:Error when unlisting columns in a data frame取消列出数据框中的列时出错
【发布时间】:2017-10-16 01:58:20
【问题描述】:

假设我有一个名为 DF 的数据框:

options(stringsAsFactors = F)

letters <- list("A", "B", "C", "D")
numbers <- list(list(1,2), 1, 1, 2)
score <- list(.44, .54, .21, .102)

DF <- data.frame(cbind(letters, numbers, score))

请注意,数据框中的所有列都属于“列表”类。

另外,看看结构:DF$numbers[1]也是一个列表

我正在尝试 UNLIST 每一列。

 DF$letters <- unlist(DF$letters)
 DF$score <- unlist(DF$score)
 DF$numbers <- unlist(DF$numbers)

但是,因为 DF$numbers[1] 也是一个列表,所以我抛出了这个错误:

 Error in `$<-.data.frame`(`*tmp*`, numbers, value = c(1, 2, 1, 1, 2)) : 
   replacement has 5 rows, data has 4

有没有一种方法可以取消列出整列,并将像 DF$numbers[1] 这样的值单元格保留为像 c(1,2) 或 1,2 这样的字符向量?

理想情况下,我希望 DF 看起来像这样,其中 number 列中的各个值仍然是 int 类型:

 letters   numbers   score
  A         1,2       .44
  B         1         .54
  C         1         .21
  D         2         .102

目标是将数据框写入 csv 文件。

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    您可以将unlist 应用于列numbers 的每个单独元素,而不是整个列:

    DF$numbers <- lapply(DF$numbers, unlist)
    
    DF
    #  letters numbers value
    #1       A    1, 2 0.440
    #2       B       1 0.540
    #3       C       1 0.210
    #4       D       2 0.102
    
    DF$numbers[1]
    #[[1]]
    #[1] 1 2
    

    如果你想要一个原子向量列,或者将元素粘贴为单个字符串:

    DF$numbers <- sapply(DF$numbers, toString)
    DF
    #  letters numbers value
    #1       A    1, 2  0.44
    #2       B       1  0.54
    #3       C       1  0.21
    #4       D       2 0.102
    
    DF$numbers[1]
    #[1] "1, 2"
    
    class(DF$numbers)
    # [1] "character"
    

    【讨论】:

    • 嗨!这是一个很好的提示,但是 DF$numbers 仍然是列表格式。当我尝试 unlist() DF$numbers
    • 如果元素包含像c(1,2) 这样的向量,numbers 列将被列出。如果不希望它是一个列表,您可以将元素作为字符串粘贴为DF$numbers &lt;- sapply(DF$numbers, toString)
    • 我明白了,是的,我希望列表的元素为 int 类型。使用 lapply 的初始方法,当我尝试使用 write.csv 编写 DF 时,我被抛出错误“ write.table 中的错误(DF,“test.csv”,col.names = NA,sep =“,” , dec = ".", : 'EncodeElement' 中未实现的类型'list'"
    • 如果您的目的是将数据框写入 csv 文件,那么事先将列转换为字符列是有意义的。您是否尝试过第二种方法?
    • 是的,但是我希望数字仍然是 int 类型
    【解决方案2】:

    你可以这样做:

    DF$letters <- unlist(DF$letters)
    DF$value <- unlist(DF$value)
    DF$numbers <- unlist(as.character(DF$numbers))
    

    这会返回:

    DF
      letters numbers value
    1       A c(1, 2) 0.440
    2       B       1 0.540
    3       C       1 0.210
    4       D       2 0.102
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 2021-04-02
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多