我有很多列的纵向数据,但是这里包含了感兴趣的列;
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的ROUND
和df2
的值添加列。列名CONC_ROUNDx
,PD_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。
答案 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))