r - R根据条件将表格转换为矩阵
问题描述
这里有张桌子:
time<-c("02:20:00",
"02:35:00",
"02:40:00",
"03:35:00",
"03:40:00",
"04:50:00",
"04:55:00",
"05:00:00",
"05:00:00",
"05:05:00",
"05:10:00",
"05:10:00",
"05:15:00",
"05:20:00",
"05:25:00",
"05:15:00",
"05:20:00",
"05:15:00",
"05:20:00")
id<-c(1,2,2,3,3,4,4,4,5,5,5,6,6,6,6,7,7,8,8)
value<-rep(1,19)
df<-data.frame(id, time, value)
有 8 个 id 占用 5 到 20 分钟的单元格。一个cell只能同时被一个id占用。如果单元格 1 被 id 1 占用,则 id 2 必须获得另一个单元格。我使用这段代码:
df2<-df %>%
group_by(time) %>%
mutate(new_names = paste0("id", 1:n())) %>%
pivot_wider(names_from = new_names)
问题是,如果前一个单元格再次空闲,则将单元格 1 中的下一个 id 切换回。
我希望这个 id 一直留在单元格 2 中。我想得到以下输出:
请你帮助我好吗?
提前致谢!英娜
解决方案
也许以下内容与您想要的足够接近-继续您的问题R 数据框表将值设置为列
x <- split(df$id, df$time)
x <- do.call("rbind", lapply(x, "[", 1:max(lengths(x))))
for(i in 2:nrow(x)) {
j <- which(!is.na(x[i,]) & x[i,] %in% x[i-1,])
k <- match(x[i,j], x[i-1,])
x[i,c(k, setdiff(1:3, k))[order(c(j, setdiff(1:3, j)))]] <- x[i,]
}
x
# [,1] [,2] [,3]
#02:20:00 1 NA NA
#02:35:00 2 NA NA
#02:40:00 2 NA NA
#03:35:00 3 NA NA
#03:40:00 3 NA NA
#04:50:00 4 NA NA
#04:55:00 4 NA NA
#05:00:00 4 5 NA
#05:05:00 NA 5 NA
#05:10:00 6 5 NA
#05:15:00 6 7 8
#05:20:00 6 7 8
#05:25:00 6 NA NA