【问题标题】:convert many lists in wide format to long format将许多宽格式列表转换为长格式
【发布时间】:2021-01-25 13:14:31
【问题描述】:

鉴于数千个列表看起来像这样,我想将数千个列表从宽格式转换为长格式:

   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)) )

UseMethod("pivot_longer") 中的错误:
没有适用于“c('double', 'numeric')”类对象的“pivot_longer”方法

这是一个包含一行和几个列表的可重现代码:

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
))

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    您可以将dat_listrbind 中的每个元素转置在一起。

    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
    

    或者用purrrmap_df

    purrr::map_df(dat_list, ~as.data.frame(t(.x)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多