gpt4 book ai didi

r - 从开始/结束间隔点展开一系列有序代码

转载 作者:行者123 更新时间:2023-12-02 09:27:49 26 4
gpt4 key购买 nike

我有一个以下类型的数据框

> foo <- data.frame(start = c(7, 12, 23, 30), end = c(10, 16, 27, 35), code = rep("A", 4))
> foo
start end code
1 7 10 A
2 12 16 A
3 23 27 A
4 30 35 A

我的目标是创建一个新的数据框series,它扩展了之前在开始/结束点压缩的有序序列,同时包含编码间隔之外的点的代码B foo:

> series
time code
1 1 B
2 2 B
3 3 B
4 4 B
5 5 B
6 6 B
7 7 A
8 8 A
9 9 A
10 10 B
11 11 B
12 12 A
13 13 A
...
29 29 B
30 30 A
31 31 A
32 32 A
33 33 A
34 34 A
35 35 A

任何帮助将不胜感激。

最佳答案

您可以使用Map,它是lapply的多元版本:

foo2 <- do.call(rbind, Map(function(s, e, c){data.frame(time = seq(s, e), 
code = c)},
foo$start, foo$end, foo$code))
head(foo2, 10)
# time code
# 1 7 A
# 2 8 A
# 3 9 A
# 4 10 A
# 5 12 A
# 6 13 A
# 7 14 A
# 8 15 A
# 9 16 A
# 10 23 A

该函数创建一个 data.frame,其中 time 作为从 startendsequence,并且code 作为该行的代码。 do.call(rbind 捕获从每一行创建的 data.frames 并重新组装它们。

然后我们可以使用 mergeis.na 填充剩余的级别:

foo3 <- merge(foo2, data.frame(time = 1:max(foo$end)), all.y = TRUE)
foo3$code <- as.character(foo3$code) # change from factor to character
foo3$code[is.na(foo3$code)] <- 'B'
head(foo3, 10)
# time code
# 1 1 B
# 2 2 B
# 3 3 B
# 4 4 B
# 5 5 B
# 6 6 B
# 7 7 A
# 8 8 A
# 9 9 A
# 10 10 A

如果您希望将数据保留为因素(合理),则可以将合并后的两行替换为:

foo3$code <- factor(foo3$code, levels = c('A', NA), labels = c('A', 'B'), exclude = NULL)

这是等效的,除了会避免转换为向量。


如果您不介意 code 是一个字符向量,并且您得到“A”和“B”的代码,那么您实际上可以从一个完整的data.frame,然后通过用apply组装序列来重新插入“A”值,这更简单一点:

foo4 <- data.frame(time = seq(1, max(foo$end)), code = 'B', stringsAsFactors = FALSE)
foo4$code[unlist(apply(foo[,1:2], 1, function(x){seq(x[1], x[2])}))] <- 'A'

关于r - 从开始/结束间隔点展开一系列有序代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36143167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com