假设我有以下数据框:
| a | b | c |
x | 1 | 2 | 3 |
y | 4 | 5 | 6 |
z | 7 | 8 | 9 |
我想将它转换为逐行列表,每行包含一个命名向量,它基本上等同于list(x=c(a=1,b=2,c=3), y=c(a=4,b=5,c=6), x=c(a=7,b=8,c=9))
的输出:
$x
a b c
1 2 3
$y
a b c
4 5 6
$x
a b c
7 8 9
我将如何做到这一点?
答案 0 :(得分:3)
我们可以使用
res <- lapply(split(df1, row.names(df1)), unlist)
str(res)
#List of 3
#$ x: Named int [1:3] 1 2 3
# ..- attr(*, "names")= chr [1:3] "a" "b" "c"
#$ y: Named int [1:3] 4 5 6
# ..- attr(*, "names")= chr [1:3] "a" "b" "c"
#$ z: Named int [1:3] 7 8 9
# ..- attr(*, "names")= chr [1:3] "a" "b" "c"
答案 1 :(得分:1)
我非常喜欢使用purrr包来完成这些任务:
df <- read.table(text = " a b c
x 1 2 3
y 4 5 6
z 7 8 9", header = TRUE)
library(purrr)
df_as_list <- set_names(by_row(df, ~ unlist(.x), .collate = "list")$.out, rownames(df))
df_as_list
# $x
# a b c
# 1 2 3
#
# $y
# a b c
# 4 5 6
#
# $z
# a b c
# 7 8 9
typeof(df_as_list$x)
# [1] "integer"
顾名思义by_row
按行循环df
,在这种情况下,将unlist(a_row)
应用于每一行,并将其作为向量返回。我们希望将输出作为列表.collate
设置为"list"
。我们返回列表.out
,然后根据需要命名(因为名称不会自然保留)。