【问题标题】:Merging specific rows into columns将特定行合并到列中
【发布时间】:2019-12-02 01:52:18
【问题描述】:

我有很多列的纵向数据,但在这里包含了感兴趣的列;

dfin1 <- 
 ID    ROUND   CONC    PD
  1     0      100     15
  1     2      120     10
  1     4      14      10 
  1     6      10      8
  2     0      120     15

以及具有多列的主题级数据;

 dfin2 <- 
  ID   HEIGHT  GENDER
   1     120     0
   2     130     1

对于每个主题,我想将CONCPD 的值列添加到ROUND 0、2、6 到df2 中。列名CONC_ROUNDxPD_ROUNDx,其中 x 是整数。输出应该是这样的:

 dfout <-  
  ID   HEIGHT  GENDER  CONC_ROUND0  PD_ROUND0  CONC_ROUND2  PD_ROUND2  CONC_ROUND6  PD_ROUND6   
   1     120     0      100          15          120          10          10            8      
   2     130     1      120          15           NA          NA          NA            NA 

我正在使用 RStudio。

【问题讨论】:

    标签: r data.table tidyr


    【解决方案1】:

    一种可能的方法来转换为广泛的形式,然后加入主题级别的数据:

    pvt <- dcast(dfin1, ID ~ ROUND, value.var=c("CONC", "PD"))
    dfin2[pvt, on=.(ID), names(pvt) := mget(paste0("i.", names(pvt)))]
    

    输出:

       ID HEIGHT GENDER CONC_0 CONC_2 CONC_4 CONC_6 PD_0 PD_2 PD_4 PD_6
    1:  1    120      0    100    120     14     10   15   10   10    8
    2:  2    130      1    120     NA     NA     NA   15   NA   NA   NA
    

    数据:

    library(data.table)
    dfin1 <- fread("ID    ROUND   CONC    PD
    1     0      100     15
    1     2      120     10
    1     4      14      10 
    1     6      10      8
    2     0      120     15")
    dfin2 <- fread("ID   HEIGHT  GENDER
    1     120     0
    2     130     1")
    

    【讨论】:

      【解决方案2】:

      这是一个带有tidyverse 的选项,其中我们filter 'ROUND' 具有感兴趣的值,然后mutate 通过在'ROUND' 列中添加前缀'ROUND',使用pivot_wider(来自tidyr 的开发版),将数据从长更改为宽(可以采用多个值列)并与第二个数据集进行连接

      library(dplyr) # 0.8.3
      library(tidyr) # 0.8.3.9000
      library(stringr)
      dfin1 %>%
         filter(ROUND %in% c(0, 2, 6)) %>%
         mutate(ROUND =  str_c("ROUND", ROUND)) %>% 
         pivot_wider(names_from = ROUND, values_from = c("CONC", "PD")) %>% 
         inner_join(dfin2, .)
      #    ID HEIGHT GENDER CONC_ROUND0 CONC_ROUND2 CONC_ROUND6 PD_ROUND0 PD_ROUND2 PD_ROUND6
      #1  1    120      0         100         120          10        15        10         8
      #2  2    130      1         120          NA          NA        15        NA        NA
      

      数据

      dfin1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L), ROUND = c(0L, 2L, 
      4L, 6L, 0L), CONC = c(100L, 120L, 14L, 10L, 120L), PD = c(15L, 
      10L, 10L, 8L, 15L)), class = "data.frame", row.names = c(NA, 
      -5L))
      
      dfin2 <- structure(list(ID = 1:2, HEIGHT = c(120L, 130L), GENDER = 0:1), 
           class = "data.frame", row.names = c(NA, 
      -2L))
      

      【讨论】:

      • @不知道为什么它给了我这个错误,尽管我已经加载了 dplyr 和 tidyr 包`pivot_wider 中的错误(。,names_from = ROUND,values_from = c(“CONC”,“PD”)) : 找不到函数“pivot_wider”`
      • @Amer tidyr 包的版本,你可以检查它是否和我在帖子中显示的一样。这是引入pivot_widerpivot_longer的开发版本
      • ‘tidyr’ 0.8.3 版;这就是我拥有的
      • @Amer 你能试试开发版吗
      • 它可以工作,但还需要为 str_c 函数加载library(stringr)!干杯!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2022-01-09
      相关资源
      最近更新 更多