将数据框列转换为存储在列表中的向量

Convert data frame columns into vectors stored in a list

我的数据包含许多 columns/variables 和三行。每个变量都是一个整数,值因行和列而异。以下是我的数据的一个最小示例:

# 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]]]) 

我尝试过各种粘贴方法,但它们生成的字符向量我无法用于 select 其他数据帧的列的索引,例如它产生这个:

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

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

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

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 视为列表(因为它实际上是一个列表)。

或使用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 删除列表的名称。