如何将 R 中的多行与数据集中的多列合并

问题描述

我想根据 record_id 列将每个 type 的行合并为一行,但 record_id 列中的志愿者除外,它们在 {{1} } 柱子。我想要这些的第二排。每个 record_id 对应一个人,他参加了一次测试(repeat=1)或两次,因此在 repeat 列中有两个条目。

这是我的数据的样子

repeat

这就是我希望得到的

structure(list(record_id = c(1,1,2,3,4,4),type = c(NA,"data_collection","test",NA,"cata_collection","test"),`repeat` = c(NA,2),dt_volunteer_reg = structure(c(1597246320,1599217080,1596184500,1598192280,NA),class = c("POSIXct","POSIXt"),tzone = "UTC"),age = c(26,64,51,39,gender = c(0,case_type = c(NA,test_dis_dt = structure(c(NA,1597250220,1600012980,1596382080,1601980740,1598284020,1603118700),"POSIXt"
),test_dis_res = c(NA,test_dis_in = c(NA,0.02,6.13,4.75,7.23,3.85),test_cont_dt = structure(c(NA,1597250280,1608636120,1605704940,1603205340),test_cont_res = c(NA,test_cont_val = c(NA,123,40000,471.6,306.5)),row.names = c(NA,-14L),class = c("tbl_df","tbl","data.frame"))

解决方法

假设第一个数据帧称为输入,并且您很高兴使用 tidyverse,您可以这样做。

input %>%
  nest(data = c(-record_id)) %>%
  mutate(
    data = map(data,~replace_na(.,as.list(head(.,1)))),# Fill in speciment details
    data = map(data,filter,!is.na(`repeat`)),# Remove speciment details
    data = map(data,# Fill in test data with data collection details
    data = map(data,type == "test")                # Remove data collection rows
  ) %>%
  unnest(data) %>%
  select(-type

有一些方法可以更简洁和/或更快地做到这一点,但这可能更具可读性。