问题描述
我想根据 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
有一些方法可以更简洁和/或更快地做到这一点,但这可能更具可读性。