将两个向量之间的差异转换为指定格式
Casting the difference between two vectors into a specified format
我正在尝试创建自动创建以下格式数据的代码(有关 colspan
的更多背景信息,请参阅 )。
我需要做两件事:
- 计算两个向量之间缺少更好词的“差异”或“距离”。
- 以某种方式转换或转置数据。
我不知道从哪里开始,所以我希望有人能帮助我开始。
所需格式
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
列与以下向量之间的差异计算 colspan
和 width
(即 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_x
的 colspan
总和应为 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)
的快捷方式。
我正在尝试创建自动创建以下格式数据的代码(有关 colspan
的更多背景信息,请参阅
我需要做两件事:
- 计算两个向量之间缺少更好词的“差异”或“距离”。
- 以某种方式转换或转置数据。
我不知道从哪里开始,所以我希望有人能帮助我开始。
所需格式
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
列与以下向量之间的差异计算 colspan
和 width
(即 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_x
的 colspan
总和应为 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)
的快捷方式。