背景:下载某数据库的数据做数据分析,发现下载的数据结构是多层list嵌套,与平时遇到的数据表(data.frame)不同,并且第二层list的名称是本人需要的变量。
问题:如何将将第二层的list的名称嵌入到内层(第三层)的数据中,作为变量?
一、什么是list列表
列表是 R 语言的对象集合,可以用来保存不同类型的数据,可以是数字、字符串、向量、另一个列表等,当然还可以包含矩阵和函数,通常用list()函数创建列表。列表list最大优点:容纳多种类型的数据,可多层嵌套。
- > df <- iris[1:10,]
- > pts <- list(x = df[,1], y = df[,2])
- > pts
- $x
- [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9
- $y
- [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1
二、简单列表list与data.frame转换
一般情况情况,as.list()和as.data.frame()可直接实现简单的list和data.frame类型数据的转换。
- as.list(x)可将数据框x按列转换为多个list
- as.data.frame(x),可将列表x按列合并为一个数据框data.frame
- > df_as.list <- as.list(df)
- > df_as.list
- $Sepal.Length
- [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9
- $Sepal.Width
- [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1
- $Petal.Length
- [1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5
- $Petal.Width
- [1] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1
- $Species
- [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
- Levels: setosa versicolor virginica
- >
- > as.data.frame(df_as.list)
- 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
- 6 5.4 3.9 1.7 0.4 setosa
- 7 4.6 3.4 1.4 0.3 setosa
- 8 5.0 3.4 1.5 0.2 setosa
- 9 4.4 2.9 1.4 0.2 setosa
- 10 4.9 3.1 1.5 0.1 setosa
- 复制代码
- > df_list <- list(
- + x = list(
- + a = iris[1:3,],
- + b = iris[6:8,],
- + c = iris[11:13,]
- + )
- + )
- > df_list
- $x
- $x$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
- 3 4.7 3.2 1.3 0.2 setosa
- $x$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
- 8 5.0 3.4 1.5 0.2 setosa
- $x$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
- 13 4.8 3.0 1.4 0.1 setosa
- > df_list <- list(
第二层list的名称直接替代了内层数据框data.frame的行名rownames,并实现数据框的行合并。
缺点:如果内层数据框的行名是需要的变量,数据会被覆盖
- > data.table::rbindlist(df_list$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: 4.7 3.2 1.3 0.2 setosa
- 4: 5.4 3.9 1.7 0.4 setosa
- 5: 4.6 3.4 1.4 0.3 setosa
- 6: 5.0 3.4 1.5 0.2 setosa
- 7: 5.4 3.7 1.5 0.2 setosa
- 8: 4.8 3.4 1.6 0.2 setosa
- 9: 4.8 3.0 1.4 0.1 setosa
- > data.table::rbindlist(df_list$x,use.names=TRUE, fill=TRUE, idcol="fenzu")
- fenzu 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: a 4.7 3.2 1.3 0.2 setosa
- 4: b 5.4 3.9 1.7 0.4 setosa
- 5: b 4.6 3.4 1.4 0.3 setosa
- 6: b 5.0 3.4 1.5 0.2 setosa
- 7: c 5.4 3.7 1.5 0.2 setosa
- 8: c 4.8 3.4 1.6 0.2 setosa
- 9: c 4.8 3.0 1.4 0.1 setosa
方法2:do.call与tibble::rownames_to_column与 tidyr::separate并用
- > df
- 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
- a.3 4.7 3.2 1.3 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
- b.8 5.0 3.4 1.5 0.2 setosa
- c.11 5.4 3.7 1.5 0.2 setosa
- c.12 4.8 3.4 1.6 0.2 setosa
- c.13 4.8 3.0 1.4 0.1 setosa
- >
- > df1 <- tibble::rownames_to_column(df,"data_code_market")
- > df1
- data_code_market Sepal.Length Sepal.Width Petal.Length Petal.Width Species
- 1 a.1 5.1 3.5 1.4 0.2 setosa
- 2 a.2 4.9 3.0 1.4 0.2 setosa
- 3 a.3 4.7 3.2 1.3 0.2 setosa
- 4 b.6 5.4 3.9 1.7 0.4 setosa
- 5 b.7 4.6 3.4 1.4 0.3 setosa
- 6 b.8 5.0 3.4 1.5 0.2 setosa
- 7 c.11 5.4 3.7 1.5 0.2 setosa
- 8 c.12 4.8 3.4 1.6 0.2 setosa
- 9 c.13 4.8 3.0 1.4 0.1 setosa
- >
- > # stringr::str_split(rownames(df),"[.]",simplify = TRUE)
- > df2 <- tidyr::separate(df1,data_code_market,into = c("fenzu","code"),sep = "[.]")
- > df2
- fenzu code Sepal.Length Sepal.Width Petal.Length Petal.Width Species
- 1 a 1 5.1 3.5 1.4 0.2 setosa
- 2 a 2 4.9 3.0 1.4 0.2 setosa
- 3 a 3 4.7 3.2 1.3 0.2 setosa
- 4 b 6 5.4 3.9 1.7 0.4 setosa
- 5 b 7 4.6 3.4 1.4 0.3 setosa
- 6 b 8 5.0 3.4 1.5 0.2 setosa
- 7 c 11 5.4 3.7 1.5 0.2 setosa
- 8 c 12 4.8 3.4 1.6 0.2 setosa
- 9 c 13 4.8 3.0 1.4 0.1 setosa
欢迎咨询,微信ahalara