如何取消之前为散点图分箱的长度数据

问题描述 投票:0回答:1

我有预先分箱的长度数据,我正在尝试创建一个散点/抖动图,其中 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')

example format

除非有其他方法可以做到这一点,否则我需要取消长度,这将look like something like this.

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)

我还没有看到很多关于人们需要取消已装箱数据的问题,因此任何帮助将不胜感激。谢谢!

r binning
1个回答
0
投票

我会这样做:

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
列。我只是将其保留下来以检查它是否有效。)

© www.soinside.com 2019 - 2024. All rights reserved.