我有预先分箱的长度数据,我正在尝试创建一个散点/抖动图,其中 x 轴上有日期,y 轴上有长度。这是一些示例数据:
df<- as.data.frame(cbind(c(20:30), c(0,0,2,3,5,2,0,0,0,0,0), c(0,0,0,2,5,3,2,0,0,0,0), c(0,0,0,0,1,4,4,3,0,0,0)))
colnames(df) <- c('Length','01-01-2023','01-02-2023','01-03-2023')
library(reshape2)
df2 <- melt(df, id.var="Length")
colnames(df2)[2:3] <- c("Date", "Number")
df2$Date <- as.Date(df2$Date, "%m-%d-%Y")
转换为长格式后,我陷入了如何对每个长度事件进行分箱,同时仍然在另一列中维护相应日期的问题。我尝试过使用 tidyr 和 rep() 创建函数,但无法弄清楚任何事情。
rep(df2$Length, df2$Number)
我可以使用rep()来获取每个长度整数,但我仍然需要每个值对应的日期。我想也许使用 for 循环来循环每一行,按出现次数复制长度值,但我仍然需要返回每个循环中的日期。
我还尝试使用 tidyr 和 lapply 但也无法使其工作。
fun <- function(x){
df2[x,] %>%
tidyr::uncount(value) %>%
magrittr::use_series("Length")
}
lapply(unique(test$Date),fun)
我还没有看到很多关于人们需要取消已装箱数据的问题,因此任何帮助将不胜感激。谢谢!
我会这样做:
result = df |>
pivot_longer(-Length, names_to = "Date", values_to = "n") |>
filter(n > 0)
result = result[rep(1:nrow(result), times = result$n), ]
result
# # A tibble: 36 × 3
# Length Date n
# <dbl> <chr> <dbl>
# 1 22 01-01-2023 2
# 2 22 01-01-2023 2
# 3 23 01-01-2023 3
# 4 23 01-01-2023 3
# 5 23 01-01-2023 3
# 6 23 01-02-2023 2
# 7 23 01-02-2023 2
# 8 24 01-01-2023 5
# 9 24 01-01-2023 5
# 10 24 01-01-2023 5
# # ℹ 26 more rows
# # ℹ Use `print(n = ...)` to see more rows
(当然,您可以删除
n
列。我只是将其保留下来以检查它是否有效。)