如何将整数向量展开为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

我想把一个整数向量展开成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, 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))