R中list与dataframe相互转换

在用R语言处理数据的过程中,我经常会遇到list和dataframe数据格式之间的转换,一般是需要把list转换为dataframe的情况居多。一直以来我也没有好好研究两者的转换关系,通常都是碰到一次花时间解决一次,不知道有没有和我一样的小伙伴。

这期推文比较系统的研究了list与dataframe转换的转换关系,希望能够对大家有所帮助,节约大家一些时间。

dataframe转换为list

> # 加载鸢尾花数据集
> data("iris")
> # 数据框转换为列表-----------------------------------------------------
> data <- iris[1:5,]
> data
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
> list1 <- as.list(data)
> list1
$Sepal.Length
[1] 5.1 4.9 4.7 4.6 5.0

$Sepal.Width
[1] 3.5 3.0 3.2 3.1 3.6

$Petal.Length
[1] 1.4 1.4 1.3 1.5 1.4

$Petal.Width
[1] 0.2 0.2 0.2 0.2 0.2

$Species
[1] setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica

list转换为dataframe

可以归纳为以下几种情形:

(1)向量——单层列表,列表的元素为向量

> ## (1)向量--------------------------------------
> list1 <- list(a=iris$Sepal.Length[1:5],
+               b=iris$Sepal.Width[1:5],
+               c=iris$Petal.Length[1:5])
> list1
$a
[1] 5.1 4.9 4.7 4.6 5.0

$b
[1] 3.5 3.0 3.2 3.1 3.6

$c
[1] 1.4 1.4 1.3 1.5 1.4

> # 3个向量按列合并
> as.data.frame(list1)
    a   b   c
1 5.1 3.5 1.4
2 4.9 3.0 1.4
3 4.7 3.2 1.3
4 4.6 3.1 1.5
5 5.0 3.6 1.4
> dplyr::bind_rows(list1)
# A tibble: 5 × 3
      a     b     c
  <dbl> <dbl> <dbl>
1   5.1   3.5   1.4
2   4.9   3     1.4
3   4.7   3.2   1.3
4   4.6   3.1   1.5
5   5     3.6   1.4

(2)数据框——单层列表,列表的元素为数据框

> ## (2)数据框------------------------------------
> list2 <- list(a=iris[1:2,],b=iris[6:7,],c=iris[11:12,])
> list2
$a
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

$b
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
6          5.4         3.9          1.7         0.4  setosa
7          4.6         3.4          1.4         0.3  setosa

$c
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
11          5.4         3.7          1.5         0.2  setosa
12          4.8         3.4          1.6         0.2  setosa

> # 3个数据框按行合并
> dplyr::bind_rows(list2) 
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          5.4         3.9          1.7         0.4  setosa
4          4.6         3.4          1.4         0.3  setosa
5          5.4         3.7          1.5         0.2  setosa
6          4.8         3.4          1.6         0.2  setosa
> # 3个数据框按行合并
> data.table::rbindlist(list2)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1:          5.1         3.5          1.4         0.2  setosa
2:          4.9         3.0          1.4         0.2  setosa
3:          5.4         3.9          1.7         0.4  setosa
4:          4.6         3.4          1.4         0.3  setosa
5:          5.4         3.7          1.5         0.2  setosa
6:          4.8         3.4          1.6         0.2  setosa
> # 3个数据框按行合并,保留1个名称
> data.table::rbindlist(list2,use.names=TRUE, fill=TRUE, idcol="group")
   group Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1:     a          5.1         3.5          1.4         0.2  setosa
2:     a          4.9         3.0          1.4         0.2  setosa
3:     b          5.4         3.9          1.7         0.4  setosa
4:     b          4.6         3.4          1.4         0.3  setosa
5:     c          5.4         3.7          1.5         0.2  setosa
6:     c          4.8         3.4          1.6         0.2  setosa
> # 3个数据框按行合并,保留2个名称
> do.call(rbind, list2)
     Sepal.Length Sepal.Width Petal.Length Petal.Width Species
a.1           5.1         3.5          1.4         0.2  setosa
a.2           4.9         3.0          1.4         0.2  setosa
b.6           5.4         3.9          1.7         0.4  setosa
b.7           4.6         3.4          1.4         0.3  setosa
c.11          5.4         3.7          1.5         0.2  setosa
c.12          4.8         3.4          1.6         0.2  setosa
> # 3个数据框按列合并
> as.data.frame(list2)
  a.Sepal.Length a.Sepal.Width a.Petal.Length a.Petal.Width a.Species b.Sepal.Length
1            5.1           3.5            1.4           0.2    setosa            5.4
2            4.9           3.0            1.4           0.2    setosa            4.6
  b.Sepal.Width b.Petal.Length b.Petal.Width b.Species c.Sepal.Length c.Sepal.Width
1           3.9            1.7           0.4    setosa            5.4           3.7
2           3.4            1.4           0.3    setosa            4.8           3.4
  c.Petal.Length c.Petal.Width c.Species
1            1.5           0.2    setosa
2            1.6           0.2    setosa

(3)多列表+向量——双层列表,外层列表的元素为多个列表,内层列表的元素为向量

> ## (3)多列表+向量
> list3 <- list(
+   a = list(var1=as.numeric(iris[1,1:4])),
+   b = list(var2=as.numeric(iris[6,1:4])),
+   c = list(var3=as.numeric(iris[11,1:4]))
+ )
> list3
$a
$a$var1
[1] 5.1 3.5 1.4 0.2

$b
$b$var2
[1] 5.4 3.9 1.7 0.4

$c
$c$var3
[1] 5.4 3.7 1.5 0.2

> # 3个向量按列合并
> as.data.frame(list3)
  var1 var2 var3
1  5.1  5.4  5.4
2  3.5  3.9  3.7
3  1.4  1.7  1.5
4  0.2  0.4  0.2

(4)多列表+数据框——双层列表,外层列表的元素为多个列表,内层列表的元素为数据框

> ## (4)多列表+数据框
> list4 <- list(
+   x = list(
+     var1 = iris[1:2,],
+     var2 = iris[6:7,]),
+   y = list(
+     var3 = iris[11:12,],
+     var4 = iris[16:17,])
+ )
> list4
$x
$x$var1
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

$x$var2
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
6          5.4         3.9          1.7         0.4  setosa
7          4.6         3.4          1.4         0.3  setosa


$y
$y$var3
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
11          5.4         3.7          1.5         0.2  setosa
12          4.8         3.4          1.6         0.2  setosa

$y$var4
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
16          5.7         4.4          1.5         0.4  setosa
17          5.4         3.9          1.3         0.4  setosa


> 
> # 4个数据框行合并
> df <- lapply(list4, bind_rows)
> bind_rows(df)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          5.4         3.9          1.7         0.4  setosa
4          4.6         3.4          1.4         0.3  setosa
5          5.4         3.7          1.5         0.2  setosa
6          4.8         3.4          1.6         0.2  setosa
7          5.7         4.4          1.5         0.4  setosa
8          5.4         3.9          1.3         0.4  setosa
> # 4个数据框列合并
> df <- as.data.frame(list4)
> df
  x.var1.Sepal.Length x.var1.Sepal.Width x.var1.Petal.Length x.var1.Petal.Width
1                 5.1                3.5                 1.4                0.2
2                 4.9                3.0                 1.4                0.2
  x.var1.Species x.var2.Sepal.Length x.var2.Sepal.Width x.var2.Petal.Length
1         setosa                 5.4                3.9                 1.7
2         setosa                 4.6                3.4                 1.4
  x.var2.Petal.Width x.var2.Species y.var3.Sepal.Length y.var3.Sepal.Width
1                0.4         setosa                 5.4                3.7
2                0.3         setosa                 4.8                3.4
  y.var3.Petal.Length y.var3.Petal.Width y.var3.Species y.var4.Sepal.Length
1                 1.5                0.2         setosa                 5.7
2                 1.6                0.2         setosa                 5.4
  y.var4.Sepal.Width y.var4.Petal.Length y.var4.Petal.Width y.var4.Species
1                4.4                 1.5                0.4         setosa
2                3.9                 1.3                0.4         setosa
> dim(df)
[1]  2 20

(5)单列表+数据框——单层列表,外层列表的元素为单个列表,内层列表的元素为数据框

第(5)种情形其实可以很容易转换为第(2)种,两个的解决方法一样。

> ## (5)单列表+数据框
> list5 <- list(
+   x = list(
+     var1 = iris[1:2,],
+     var2 = iris[6:7,],
+     var3 = iris[11:12,])
+ )
> list5
$x
$x$var1
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

$x$var2
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
6          5.4         3.9          1.7         0.4  setosa
7          4.6         3.4          1.4         0.3  setosa

$x$var3
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
11          5.4         3.7          1.5         0.2  setosa
12          4.8         3.4          1.6         0.2  setosa


> 
> #三个数据框行合并
> dplyr::bind_rows(list5$x) 
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          5.4         3.9          1.7         0.4  setosa
4          4.6         3.4          1.4         0.3  setosa
5          5.4         3.7          1.5         0.2  setosa
6          4.8         3.4          1.6         0.2  setosa
> #三个数据框列合并
> as.data.frame(list5)
  x.var1.Sepal.Length x.var1.Sepal.Width x.var1.Petal.Length x.var1.Petal.Width
1                 5.1                3.5                 1.4                0.2
2                 4.9                3.0                 1.4                0.2
  x.var1.Species x.var2.Sepal.Length x.var2.Sepal.Width x.var2.Petal.Length
1         setosa                 5.4                3.9                 1.7
2         setosa                 4.6                3.4                 1.4
  x.var2.Petal.Width x.var2.Species x.var3.Sepal.Length x.var3.Sepal.Width
1                0.4         setosa                 5.4                3.7
2                0.3         setosa                 4.8                3.4
  x.var3.Petal.Length x.var3.Petal.Width x.var3.Species
1                 1.5                0.2         setosa
2                 1.6                0.2         setosa

这部分讲起来有一些绕,大家自己运行起来跑跑看就知道怎么回事了。

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮肤小白生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值