将特定行合并为列

时间:2019-07-24 01:05:43

标签: r data.table tidyr

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

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

对于每个主题,我想在CONC中将PD 0、2、6的ROUNDdf2的值添加列。列名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。

2 个答案:

答案 0 :(得分:4)

一种可能的方法,可以转变为广泛的形式,然后与主题级别的数据结合:

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

答案 1 :(得分:3)

这里是tidyverse的一个选项,其中我们filter带有感兴趣值的'ROUND',然后通过使用'ROUND'列添加前缀'ROUND'到mutate 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))