首页 > 解决方案 > 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 中。我想得到以下输出:

在此处输入图像描述

请你帮助我好吗?

提前致谢!英娜

标签: rdplyr

解决方案


也许以下内容与您想要的足够接近-继续您的问题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

推荐阅读