将两个向量之间的差异转换为指定格式

Casting the difference between two vectors into a specified format

我正在尝试创建自动创建以下格式数据的代码(有关 colspan 的更多背景信息,请参阅 )。

我需要做两件事:

  1. 计算两个向量之间缺少更好词的“差异”或“距离”。
  2. 以某种方式转换或转置数据。

我不知道从哪里开始,所以我希望有人能帮助我开始。

所需格式

lower_threshold <- data.frame(row=c("Lower threshold"), freq = c(0, 25, 50, 100, 250, 500, 1000, 1500, 3000, "Infinity", "SUM"), width=50, colspan=1)

               row  freq width colspan
1  Lower threshold     0    50      1
2  Lower threshold    25    50      1
3  Lower threshold    50    50      1
4  Lower threshold   100    50      1
5  Lower threshold   250    50      1
6  Lower threshold   500    50      1
7  Lower threshold  1000    50      1
8  Lower threshold  1500    50      1
9  Lower threshold  3000    50      1
10 Lower threshold   SUM    50      1

要格式化的数据

我的数据如下:

dat <- structure(list(Name = c("Name_a", 
"Name_b"), freq = list(bb = c(5, 4, 3, 2, 14), aa = c(1, 6, 0, 7)), columns_used = list(bb = c(0, 25, 100, 500, "Infinity", "SUM"), aa = c(0, 25, 3000, "Infinity", "SUM"))), row.names = c(NA, 
-2L), class = "data.frame")

正在计算colspan/width

我想根据 columns_used 列与以下向量之间的差异计算 colspanwidth(即 50*colspan):

total_colspan = c(0, 25, 50, 100, 250, 500, 1000, 1500, 3000, "Infinity", "SUM")

例如,对于 Name_a,第一个 colspan 将是 1(和 width=50),因为第一个阈值是 0-25两个向量。但是 Name_a 跳过数字 50,所以下一个 colspan 应该是 2(和 width=100)。

期望的输出:

   row         row freq  width colspan
1  Name_a              5    50      1
2  Name_a              4   100      2
3  Name_a              3   100      2
4  Name_a              2   200      4
5  Name_a             14    50      1
6  Name_b              1    50      1
...
11 Name_b              7    50      1

其中每个 Name_xcolspan 总和应为 10,而 row_freq 来自 dat 中的 freq 列。

想法是使用所需的输出来创建 hmtl table:

当然可以改进,但这里有一个粗略的方法:

l <- lapply(dat$columns_used, \(y) sapply(y, \(x) which(total_colspan == x) - which(y == x)))

dat[1:2] %>% 
  unnest_longer(freq) %>% 
  mutate(colspan = unlist(lapply(l, \(x) diff(x) + 1)),
         width = colspan * 50)

# A tibble: 9 x 4
  Name    freq colspan width
  <chr>  <dbl>   <dbl> <dbl>
1 Name_a     5       1    50
2 Name_a     4       2   100
3 Name_a     3       2   100
4 Name_a     2       4   200
5 Name_a    14       1    50
6 Name_b     1       1    50
7 Name_b     6       7   350
8 Name_b     0       1    50
9 Name_b     7       1    50

注意:\(x)function(x) 的快捷方式。