将数据帧转换为R

时间:2016-07-23 14:26:11

标签: r

假设我有以下数据框:

  | 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 

我将如何做到这一点?

2 个答案:

答案 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,然后根据需要命名(因为名称不会自然保留)。