将许多宽格式列表转换为长格式
convert many lists in wide format to long format
我想将数千个列表从宽格式转换为长格式,因为数千个列表如下所示:
y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 coverage_fraction
4 12 12 12 12 12 12 12 12 12 12 0.0005232538
9 12 12 12 12 12 12 12 12 12 12 0.1390771568
10 12 12 12 12 12 12 12 12 12 12 0.7728050947
.
.
46 12 12 12 12 12 12 12 12 12 12 0.0005232538
有没有办法将 pivot_longer(-c(11)
放入函数中,例如 mapply()
,将每个列表的列更改为长格式,同时保留单个列表元素?
本质上,我想使用这段代码:
lc_extract_pred <- landcover %>%
exact_extract(r_cells, progress = FALSE) %>% *Convert from wide to long here* %>%
map(~ count(., landcover=value)) %>%
tibble(id = r_cells$id, data = .) %>%
unnest(data)
如果我可以 pivot_longer()
,那么年份的值通常会被分配一个列名 value
,因此在映射中分配 landcover=value
,并将其转换为 tibble()
格式。
dat_list %>% map_lgl(function(x) pivot_longer(-c(11)) )
Error in UseMethod("pivot_longer") :
no applicable method for 'pivot_longer' applied to an object of class "c('double', 'numeric')"
这是包含一行和一些列表的可重现代码:
list(c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1,
y2015 = 1, y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = -1.33003238502638
), c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1, y2015 = 1,
y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = 0.682342381930735
), c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1, y2015 = 1,
y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = -2.09817126581704
), c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1, y2015 = 1,
y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = -0.0942304747486628
), c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1, y2015 = 1,
y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = -0.944268346233405
))
您可以将 dat_list
和 rbind
中的每个元素转置在一起。
result <- do.call(rbind.data.frame, lapply(dat_list, t))
# y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 coverage_fraction
#1 1 1 1 1 1 1 1 1 1 1 -1.33003239
#2 1 1 1 1 1 1 1 1 1 1 0.68234238
#3 1 1 1 1 1 1 1 1 1 1 -2.09817127
#4 1 1 1 1 1 1 1 1 1 1 -0.09423047
#5 1 1 1 1 1 1 1 1 1 1 -0.94426835
或 purrr
的 map_df
:
purrr::map_df(dat_list, ~as.data.frame(t(.x)))
我想将数千个列表从宽格式转换为长格式,因为数千个列表如下所示:
y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 coverage_fraction
4 12 12 12 12 12 12 12 12 12 12 0.0005232538
9 12 12 12 12 12 12 12 12 12 12 0.1390771568
10 12 12 12 12 12 12 12 12 12 12 0.7728050947
.
.
46 12 12 12 12 12 12 12 12 12 12 0.0005232538
有没有办法将 pivot_longer(-c(11)
放入函数中,例如 mapply()
,将每个列表的列更改为长格式,同时保留单个列表元素?
本质上,我想使用这段代码:
lc_extract_pred <- landcover %>%
exact_extract(r_cells, progress = FALSE) %>% *Convert from wide to long here* %>%
map(~ count(., landcover=value)) %>%
tibble(id = r_cells$id, data = .) %>%
unnest(data)
如果我可以 pivot_longer()
,那么年份的值通常会被分配一个列名 value
,因此在映射中分配 landcover=value
,并将其转换为 tibble()
格式。
dat_list %>% map_lgl(function(x) pivot_longer(-c(11)) )
Error in UseMethod("pivot_longer") :
no applicable method for 'pivot_longer' applied to an object of class "c('double', 'numeric')"
这是包含一行和一些列表的可重现代码:
list(c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1,
y2015 = 1, y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = -1.33003238502638
), c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1, y2015 = 1,
y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = 0.682342381930735
), c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1, y2015 = 1,
y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = -2.09817126581704
), c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1, y2015 = 1,
y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = -0.0942304747486628
), c(y2010 = 1, y2011 = 1, y2012 = 1, y2013 = 1, y2014 = 1, y2015 = 1,
y2016 = 1, y2017 = 1, y2018 = 1, y2019 = 1, coverage_fraction = -0.944268346233405
))
您可以将 dat_list
和 rbind
中的每个元素转置在一起。
result <- do.call(rbind.data.frame, lapply(dat_list, t))
# y2010 y2011 y2012 y2013 y2014 y2015 y2016 y2017 y2018 y2019 coverage_fraction
#1 1 1 1 1 1 1 1 1 1 1 -1.33003239
#2 1 1 1 1 1 1 1 1 1 1 0.68234238
#3 1 1 1 1 1 1 1 1 1 1 -2.09817127
#4 1 1 1 1 1 1 1 1 1 1 -0.09423047
#5 1 1 1 1 1 1 1 1 1 1 -0.94426835
或 purrr
的 map_df
:
purrr::map_df(dat_list, ~as.data.frame(t(.x)))