【问题标题】:merge list elements which are different dimensions r [duplicate]合并不同维度r的列表元素[重复]
【发布时间】:2019-10-16 02:42:59
【问题描述】:

我有一个 df:

df= data.frame(year=c(rep(2018,4),rep(2017,3)),Area=c(1:4,1:3),P=1:7,N=1:7)

我想将其按年份拆分,然后再次将所有内容合并在一起,这样我就可以将年份视为每个区域的列。为了做到这一点,我正在拆分和合并:

s=split(df,df$year)
m=merge(s[[1]][,2:4],[s[[2]][,2:4],by='Area',all=1)
colnames(m)=c('area','P2018','C2018','P2017','C2017')

我确信有一种更有效的方法,尤其是当我包含其他年份的数据时出错的可能性非常高。

有什么建议吗?

【问题讨论】:

    标签: r list merge split


    【解决方案1】:

    我们可以将gather 数据转换为长格式,不包括yearArea 列,unite year 然后将spread 转换为宽格式。

    library(dplyr)
    library(tidyr)
    
    df %>%
      gather(key, value, -year, -Area) %>%
      unite(key, key, year, sep = "") %>%
      spread(key, value)
    
    #  Area N2017 N2018 P2017 P2018
    #1    1     5     1     5     1
    #2    2     6     2     6     2
    #3    3     7     3     7     3
    #4    4    NA     4    NA     4
    

    【讨论】:

      【解决方案2】:

      我们可以使用来自data.tabledcast 来做到这一点,它可以占用多个value.var

      library(data.table)
      dcast(setDT(df), Area ~ year, value.var = c("P", "N"))
      #  Area P_2017 P_2018 N_2017 N_2018
      #1:    1      5      1      5      1
      #2:    2      6      2      6      2
      #3:    3      7      3      7      3
      #4:    4     NA      4     NA      4
      

      【讨论】:

        猜你喜欢
        • 2014-06-08
        • 2016-02-01
        • 2023-02-19
        • 2016-08-18
        • 2013-06-01
        • 2021-06-13
        • 1970-01-01
        • 2023-01-12
        • 2020-06-19
        相关资源
        最近更新 更多