【问题标题】:Convert data frame columns into vectors stored in a list将数据框列转换为存储在列表中的向量
【发布时间】:2019-11-20 06:44:48
【问题描述】:

我的数据由许多列/变量和三行组成。每个变量都是一个整数,并且值因行和列而异。以下是我的数据的一个最小示例:

# Minimal example of data frame I have
df <- data.frame(x1 = c(1,2,3), 
                 x2 = c(4,1,6), 
                 x3 = c(3,0,2), 
                 x4 = c(3,0,1))

我试图以某种方式将每一列折叠成一个包含每一行中的值的数字向量。例如,我想要这样的东西:

# Desired data based on minimal example
 target_list <- list(c(1,2,3),
                     c(4,1,6),
                     c(3,0,2),
                     c(3,0,1))

最终目标是能够获取另一个具有许多列的数据框,并生成一个新数据框,该数据框仅包含索引与每个数字向量中的值匹配的列。对于每个向量,我生成另一个数据框。所有帧都存储在一个列表中。给定工作示例输入的目标输出示例:

# Example "super data frame" I will subset. The values contained in each column are arbitrary.
 df2 <- data.frame(z1 = "a", z2 = "b",
                   z3 = 999, z4 = NA, 
                   z5 = "foo", z6 = "bar")

# Subset "super data frame" to only columns in each vector in the list, store in a list
list(df2[ ,target_list[[1]]],
     df2[ ,target_list[[2]]],
     df2[ ,target_list[[3]]],
     df2[ ,target_list[[4]]]) 

我尝试了各种粘贴方法,但它们产生的字符向量我不能用来按索引选择其他数据帧的列,例如它产生这个:

 paste0(df[1, ], df[2, ], df[3, ], df[4, ])

关于如何从 df 生成数值向量列表的任何帮助?

【问题讨论】:

    标签: r list dataframe numeric


    【解决方案1】:

    或使用as.list

    as.list(df)
    
    #$x1
    #[1] 1 2 3
    
    #$x2
    #[1] 4 1 6
    
    #$x3
    #[1] 3 0 2
    
    #$x4
    #[1] 3 0 1
    

    您可以使用unname 删除列表的名称。

    【讨论】:

    • 这也很好,我已经投了赞成票,但是另一个选项提供了更多关于为什么它有效的逻辑..
    【解决方案2】:

    也许我遗漏了一些东西,但您的输入和您的目标之间的唯一区别是三个属性:

    attributes(df)
    #$names
    #[1] "x1" "x2" "x3" "x4"
    #
    #$class
    #[1] "data.frame"
    #
    #$row.names
    #[1] 1 2 3
    

    您可以删除它们:

    attributes(df) <- NULL
    df
    #[[1]]
    #[1] 1 2 3
    #
    #[[2]]
    #[1] 4 1 6
    #
    #[[3]]
    #[1] 3 0 2
    #
    #[[4]]
    #[1] 3 0 1
    

    或者,或者:

    c(unname(unclass(df)))
    

    但是,当然,这些属性并没有什么坏处,您始终可以将 data.frame 视为一个列表(因为它实际上是一个列表)。

    【讨论】:

    • 这实际上非常简单并且可以完成工作。删除数据框的属性是否会产生所需的结果,因为数据框只是具有某些属性的列表?删除属性后,str(df) 显示我现在有一个列表,并且 attributes(df)
    • data.frame 是一个列表。就这么简单。
    猜你喜欢
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多