将嵌套数据框中的数据提取到同一记录中
Extract data from a nested dataframe into the same record
我有这个主数据框:
testdataframe
id sensors_data
<chr> <list>
1 AA <data.frame [6 × 4]>
2 BB <data.frame [6 × 4]>
sensors_data 的每个数据帧如下所示:
id type value status
<chr><chr> <dbl> <int>
1 SN01TP a 25.800 1
2 SN01HU b 40.000 1
3 SN02VD c 1.146 1
4 SN02C2 d 1270.000 1
5 SY01DS e 31.000 1
6 TD01TP f 22.500 1
我希望我的主要数据框是这样的,而不仅仅是 sensors_data
:
a b c d e f
1 25.800 40.000 1.146 1270.000 31.000 22.500
我试过取消嵌套主数据框,但这会为每个字段创建一条记录。我正在尝试的是改变主数据框以访问 sensors_data 中的数据,但我不知道该怎么做。
使用purrr:map
和tidyr::pivot_wider
,你可以做到这一点。如果你想要一个数据帧,请使用 bind_rows
。
df$pivoted <- df$sensors_data %>%
map(~ tidyr::pivot_wider(.[,c("type","value")], names_from = type))
df$pivoted
[[1]]
a b c d e f
1 25.8 40 1.15 1270 31 22.5
[[2]]
a b c d e f
1 25.8 40 1.15 1270 31 22.5
df
# A tibble: 2 x 3
id sensors_data pivoted
<chr> <list> <list>
1 AA <df [6 x 4]> <tibble [1 x 6]>
2 BB <df [6 x 4]> <tibble [1 x 6]>
或者,bind_rows
和 bind_cols
:
df$sensors_data %>%
map(~ tidyr::pivot_wider(.[,c("type","value")], names_from = type)) %>%
bind_rows() %>%
bind_cols(df,.)
# A tibble: 2 x 8
id sensors_data a b c d e f
<chr> <list> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 AA <df [6 x 4]> 25.8 40 1.15 1270 31 22.5
2 BB <df [6 x 4]> 25.8 40 1.15 1270 31 22.5
数据:
df1 <- read.table(header = T, text=" id type value status
1 SN01TP a 25.800 1
2 SN01HU b 40.000 1
3 SN02VD c 1.146 1
4 SN02C2 d 1270.000 1
5 SY01DS e 31.000 1
6 TD01TP f 22.500 1")
df <- tibble(id = c("AA", "BB"), sensors_data = list(df1,df1))
> df
id sensors_data
1 AA <df [6 x 4]>
2 BB <df [6 x 4]>
Maël 已经提供了我最喜欢的答案!
这是使用 lapply
的替代方法
library(dplyr)
library(tidyr)
sensors_data_sub <- lapply(sensors_data, function(x)x[,2:3])
sensors_data_sub_wide <- lapply(1:length(sensors_data_sub),
function(x) (pivot_wider(sensors_data_sub[[x]], names_from = type, values_from = value)))
bind_rows(sensors_data_sub_wide)
a b c d e f
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 25.8 40 1.15 1270 31 22.5
2 25.8 40 1.15 1270 31 22.5
我有这个主数据框:
testdataframe
id sensors_data
<chr> <list>
1 AA <data.frame [6 × 4]>
2 BB <data.frame [6 × 4]>
sensors_data 的每个数据帧如下所示:
id type value status
<chr><chr> <dbl> <int>
1 SN01TP a 25.800 1
2 SN01HU b 40.000 1
3 SN02VD c 1.146 1
4 SN02C2 d 1270.000 1
5 SY01DS e 31.000 1
6 TD01TP f 22.500 1
我希望我的主要数据框是这样的,而不仅仅是 sensors_data
:
a b c d e f
1 25.800 40.000 1.146 1270.000 31.000 22.500
我试过取消嵌套主数据框,但这会为每个字段创建一条记录。我正在尝试的是改变主数据框以访问 sensors_data 中的数据,但我不知道该怎么做。
使用purrr:map
和tidyr::pivot_wider
,你可以做到这一点。如果你想要一个数据帧,请使用 bind_rows
。
df$pivoted <- df$sensors_data %>%
map(~ tidyr::pivot_wider(.[,c("type","value")], names_from = type))
df$pivoted
[[1]]
a b c d e f
1 25.8 40 1.15 1270 31 22.5
[[2]]
a b c d e f
1 25.8 40 1.15 1270 31 22.5
df
# A tibble: 2 x 3
id sensors_data pivoted
<chr> <list> <list>
1 AA <df [6 x 4]> <tibble [1 x 6]>
2 BB <df [6 x 4]> <tibble [1 x 6]>
或者,bind_rows
和 bind_cols
:
df$sensors_data %>%
map(~ tidyr::pivot_wider(.[,c("type","value")], names_from = type)) %>%
bind_rows() %>%
bind_cols(df,.)
# A tibble: 2 x 8
id sensors_data a b c d e f
<chr> <list> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 AA <df [6 x 4]> 25.8 40 1.15 1270 31 22.5
2 BB <df [6 x 4]> 25.8 40 1.15 1270 31 22.5
数据:
df1 <- read.table(header = T, text=" id type value status
1 SN01TP a 25.800 1
2 SN01HU b 40.000 1
3 SN02VD c 1.146 1
4 SN02C2 d 1270.000 1
5 SY01DS e 31.000 1
6 TD01TP f 22.500 1")
df <- tibble(id = c("AA", "BB"), sensors_data = list(df1,df1))
> df
id sensors_data
1 AA <df [6 x 4]>
2 BB <df [6 x 4]>
Maël 已经提供了我最喜欢的答案!
这是使用 lapply
library(dplyr)
library(tidyr)
sensors_data_sub <- lapply(sensors_data, function(x)x[,2:3])
sensors_data_sub_wide <- lapply(1:length(sensors_data_sub),
function(x) (pivot_wider(sensors_data_sub[[x]], names_from = type, values_from = value)))
bind_rows(sensors_data_sub_wide)
a b c d e f
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 25.8 40 1.15 1270 31 22.5
2 25.8 40 1.15 1270 31 22.5