如何根据R中的公共列合并行

How to merge rows based on common columns in R

我正在使用如下所示的数据框:

vims <- data.frame(
  patient_ID = c("a", "a", "a", "b", "b"),
  Date = c(2020, 2020, 2018, 2020, 2028),
  Eye = c("Right", "Left", "Right", "Right", "Right"),
  V1 = c(21, 18, 30, 30, 18)
  V2 = c(28, 30, 15, 45, 60)
)

如您所见,数据有一个 ID,并且可能在不同日期对同一个 ID 进行多次评估,并且在这些日期内可能有不同的眼睛评估。我正在尝试合并行以便按 ID 和日期排列以获得包含同一行中每只眼睛的 ID、日期和所有信息的行(如果可用,右眼和左眼的 V1)

你在找这个吗:

library(dplyr)
library(tidyr)

vims %>% pivot_wider(id_cols = c(patient_ID, Date), names_from = Eye, values_from = c(V1,V2))
# A tibble: 4 x 6
  patient_ID  Date V1_Right V1_Left V2_Right V2_Left
  <chr>      <dbl>    <dbl>   <dbl>    <dbl>   <dbl>
1 a           2020       21      18       28      30
2 a           2018       30      NA       15      NA
3 b           2020       30      NA       45      NA
4 b           2028       18      NA       60      NA

一个data.table备选方案:

library(data.table)
vims <- as.data.table(vims)

dcast(vims, patient_ID+Date~Eye, value.var = c("V1","V2"))

   patient_ID Date V1_Left V1_Right V2_Left V2_Right
1:          a 2018      NA       30      NA       15
2:          a 2020      18       21      30       28
3:          b 2020      NA       30      NA       45
4:          b 2028      NA       18      NA       60