如何将整数向量展开为r中每个组中的连续整数
我想把一个整数向量展开成r中每个组中的连续整数。谁能对这个问题有一些提示吗 以下是我的原始数据集:如何将整数向量展开为r中每个组中的连续整数,r,R,我想把一个整数向量展开成r中每个组中的连续整数。谁能对这个问题有一些提示吗 以下是我的原始数据集: x = c(1, 2, 3, 4, 5, 1, 3, 5, 6, 1, 2, 3, 6, 8) group = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3) data = data.frame(x, group) 我想要的数据集如下所示: desired_data = data.frame( x = c(1, 2, 3, 4, 5, 1
x = c(1, 2, 3, 4, 5, 1, 3, 5, 6, 1, 2, 3, 6, 8)
group = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3)
data = data.frame(x, group)
我想要的数据集如下所示:
desired_data = data.frame(
x = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8),
group = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3))
谢谢你的帮助 这可以通过
从tidyr
展开轻松完成
library(tidyverse)
df %>%
group_by(group) %>%
expand(x = full_seq(x, 1))
这就给了,
#一个tible:19 x 2
#分组:分组[3]
x组
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
6 2 1
7 2 2
8 2 3
9 2 4
10 2 5
11 2 6
12 3 1
13 3 2
14 3 3
15 3 4
16 3 5
17 3 6
18 3 7
19 3 8
这可以通过tidyr
中的expand
轻松完成
library(tidyverse)
df %>%
group_by(group) %>%
expand(x = full_seq(x, 1))
这就给了,
#一个tible:19 x 2
#分组:分组[3]
x组
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
6 2 1
7 2 2
8 2 3
9 2 4
10 2 5
11 2 6
12 3 1
13 3 2
14 3 3
15 3 4
16 3 5
17 3 6
18 3 7
19 3 8
我相信很快就会有人找到更干净的解决方案。同时:
minVals=aggregate(data$x, by = list(data$group), min)[,2]
maxVals=aggregate(data$x, by = list(data$group), max)[,2]
ls=apply(cbind(minVals,maxVals),1,function(x) x[1]:x[2])
desired_data = data.frame(
x = unlist(ls),
group = rep(unique(data$group),lapply(ls,length)))
x group
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 1 2
7 2 2
8 3 2
9 4 2
10 5 2
11 6 2
12 1 3
13 2 3
14 3 3
15 4 3
16 5 3
17 6 3
18 7 3
19 8 3
我相信很快就会有人找到更干净的解决方案。同时:
minVals=aggregate(data$x, by = list(data$group), min)[,2]
maxVals=aggregate(data$x, by = list(data$group), max)[,2]
ls=apply(cbind(minVals,maxVals),1,function(x) x[1]:x[2])
desired_data = data.frame(
x = unlist(ls),
group = rep(unique(data$group),lapply(ls,length)))
x group
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 1 2
7 2 2
8 3 2
9 4 2
10 5 2
11 6 2
12 1 3
13 2 3
14 3 3
15 4 3
16 5 3
17 6 3
18 7 3
19 8 3
这是一个基本的R解决方案
x = c(1, 2, 3, 4, 5, 1, 3, 5, 6, 1, 2, 3, 6, 8)
group = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3)
sl = split(x,group)
expanded = lapply(names(sl),function(x){
r = range(sl[[x]])
return(data.frame(x = seq(r[1],r[2],1),group = x))
})
do.call(rbind,expanded)
- 按组拆分x,从而为每个组生成一个命名列表
- 在名称上使用
lappy
,我们可以扩展每个组的整数范围
- 最后使用
do.call
将结果重新绑定在一起
这里有一个基本的R解决方案
x = c(1, 2, 3, 4, 5, 1, 3, 5, 6, 1, 2, 3, 6, 8)
group = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3)
sl = split(x,group)
expanded = lapply(names(sl),function(x){
r = range(sl[[x]])
return(data.frame(x = seq(r[1],r[2],1),group = x))
})
do.call(rbind,expanded)
- 按组拆分x,从而为每个组生成一个命名列表
- 在名称上使用
lappy
,我们可以扩展每个组的整数范围
- 最后使用
do.call
将结果重新绑定在一起
谢谢索托斯。你的回答非常简洁和有用。但是,当任何数据组以大于1的任何数字开始时,此代码不起作用。在这种情况下,“扩展”不能将x扩展为从1到最大数的完整序列。你对修复那个bug有什么想法吗?我已经弄明白了。当任意一组x从大于1的整数开始时,下面的代码效果更好<代码>数据%>%group_by(group)%%>%expand(x=full_seq(1:max(x),1))
感谢Sotos。你的回答非常简洁和有用。但是,当任何数据组以大于1的任何数字开始时,此代码不起作用。在这种情况下,“扩展”不能将x扩展为从1到最大数的完整序列。你对修复那个bug有什么想法吗?我已经弄明白了。当任意一组x从大于1的整数开始时,下面的代码效果更好<代码>数据%>%group\U by(group)%%>%expand(x=full\U seq(1:max(x),1))