【问题标题】:Convert entire data frame into one long column (vector)将整个数据框转换为一长列(向量)
【发布时间】:2018-03-14 12:51:20
【问题描述】:

我想将数字(包括 NA)数据框的全部内容转换为一列。实现以下目标的最明智方法是什么?

>df <- data.frame(C1=c(1,NA,3),C2=c(4,5,NA),C3=c(NA,8,9))
>df
     C1 C2 C3
  1  1  4 NA
  2 NA  5  8
  3  3 NA  9

>x <- mysterious_operation(df)
>x
[1] 1 NA 3 4 5 NA NA 8 9

我想计算这个向量的平均值,所以理想情况下我想删除神秘操作中的 NA - 我正在处理的数据框非常大,所以这可能是个好主意。

【问题讨论】:

  • 随便df1 &lt;- data.frame(col =unlist(df))
  • unlist(df, use.names = F) 不保留名称。这会给[1] 1 NA 3 4 5 NA NA 8 9

标签: r


【解决方案1】:

这是purrr的几种方法:

# using invoke, a wrapper around do.call
purrr::invoke(c, df, use.names = FALSE)

# similar to unlist, reduce list of lists to a single vector
purrr::flatten_dbl(df)

两者都返回:

[1]  1 NA  3  4  5 NA NA  8  9

【讨论】:

    【解决方案2】:

    你要找的神秘操作叫unlist

    > df <- data.frame(C1=c(1,NA,3),C2=c(4,5,NA),C3=c(NA,8,9))
    > unlist(df, use.names = F)
    [1]  1 NA  3  4  5 NA NA  8  9
    

    【讨论】:

    • 这与@tyluRp 之前发布的评论有何不同?
    【解决方案3】:

    我们可以使用unlist 并创建一个单列data.frame

    df1 <- data.frame(col =unlist(df))
    

    【讨论】:

      【解决方案4】:

      只是为了好玩。当然unlist是最合适的函数。

      1. 另类

        stack(df)[,1]

      2. 另类

        do.call(c,df)

        do.call(c,c(df,use.names=F)) #unnamed version

      也许他们更神秘。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        • 2020-02-13
        • 2017-10-31
        相关资源
        最近更新 更多