压缩/总结R中的字符串开始和长度数据
compress / summarize string start and length data in R
我在一个较大的字符串中有 data.frame
个(子)字符串位置。数据包含(子)字符串的开头及其长度。可以很容易地计算出(子)字符串的结束位置。
data1 <- data.frame(start = c(1,3,4,9,10,13),
length = c(2,1,3,1,2,1)
)
data1$end <- (data1$start + data1$length - 1)
data1
#> start length end
#> 1 1 2 2
#> 2 3 1 3
#> 3 4 3 6
#> 4 9 1 9
#> 5 10 2 11
#> 6 13 1 13
由 reprex package (v0.3.0)
于 2019-12-10 创建
我想 'compress' 这个 data.frame
通过总结连续的(子)字符串(相互连接的字符串),这样我的新数据看起来像这样:
data2 <- data.frame(start = c(1,9,13),
length = c(6,3,1)
)
data2$end <- (data2$start + data2$length - 1)
data2
#> start length end
#> 1 1 6 6
#> 2 9 3 11
#> 3 13 1 13
由 reprex package (v0.3.0)
于 2019-12-10 创建
是否有更好的基础 R 解决方案可以让我从 data1
到 data2
?
使用dplyr
我们可以做以下事情:
library(dplyr)
data1 %>%
group_by(consecutive = cumsum(start != lag(end, default = 0) + 1)) %>%
summarise(start = min(start), length=sum(length), end=max(end)) %>%
ungroup %>% select(-consecutive)
#> # A tibble: 3 x 3
#> start length end
#> <dbl> <dbl> <dbl>
#> 1 1 6 6
#> 2 9 3 11
#> 3 13 1 13
f = cumsum(with(data1, c(0, start[-1] - head(end, -1))) != 1)
do.call(rbind, lapply(split(data1, f), function(x){
with(x, data.frame(start = start[1],
length = tail(end, 1) - start[1] + 1,
end = tail(end, 1)))}))
# start length end
#1 1 6 6
#2 9 3 11
#3 13 1 13
我在一个较大的字符串中有 data.frame
个(子)字符串位置。数据包含(子)字符串的开头及其长度。可以很容易地计算出(子)字符串的结束位置。
data1 <- data.frame(start = c(1,3,4,9,10,13),
length = c(2,1,3,1,2,1)
)
data1$end <- (data1$start + data1$length - 1)
data1
#> start length end
#> 1 1 2 2
#> 2 3 1 3
#> 3 4 3 6
#> 4 9 1 9
#> 5 10 2 11
#> 6 13 1 13
由 reprex package (v0.3.0)
于 2019-12-10 创建我想 'compress' 这个 data.frame
通过总结连续的(子)字符串(相互连接的字符串),这样我的新数据看起来像这样:
data2 <- data.frame(start = c(1,9,13),
length = c(6,3,1)
)
data2$end <- (data2$start + data2$length - 1)
data2
#> start length end
#> 1 1 6 6
#> 2 9 3 11
#> 3 13 1 13
由 reprex package (v0.3.0)
于 2019-12-10 创建是否有更好的基础 R 解决方案可以让我从 data1
到 data2
?
使用dplyr
我们可以做以下事情:
library(dplyr)
data1 %>%
group_by(consecutive = cumsum(start != lag(end, default = 0) + 1)) %>%
summarise(start = min(start), length=sum(length), end=max(end)) %>%
ungroup %>% select(-consecutive)
#> # A tibble: 3 x 3
#> start length end
#> <dbl> <dbl> <dbl>
#> 1 1 6 6
#> 2 9 3 11
#> 3 13 1 13
f = cumsum(with(data1, c(0, start[-1] - head(end, -1))) != 1)
do.call(rbind, lapply(split(data1, f), function(x){
with(x, data.frame(start = start[1],
length = tail(end, 1) - start[1] + 1,
end = tail(end, 1)))}))
# start length end
#1 1 6 6
#2 9 3 11
#3 13 1 13