【问题标题】:extracting exact number of rows from a list [closed]从列表中提取确切的行数[关闭]
【发布时间】:2016-08-10 11:56:35
【问题描述】:

数字列表

a
1
2
3 
6
7
8
9
10
11
12
15
16
19
20
21
22
23
24
25

提取 3 个不重复的连续值。 结果应该是这样的

这就像每 3 行连续到列,但我们可以看到 7,8,9 也是连续的,但忽略了删除重复项

a   b   c
1   2   3
6   7   8
9  10  11
19 20  21
22 23  24

提前致谢

【问题讨论】:

  • 实际数据安静大
  • 好吧,我没有看你的第二个逻辑。每个连续序列的长度是否不同,还是总是 3?
  • 我总是需要3个连续的,没有重复
  • 好的,我会从中列出来
  • 我的意思是如果它的长度不同,现在看起来很好。

标签: r


【解决方案1】:

有点不整洁,但能胜任:

d <- data.frame(a=a[-(1:2)], diff=diff(a, 2))
d$br <- 0
for (i in 1:nrow(d)) {
  if (i==1 & d$diff[1]==2) {
    d$br[1] <- 1
  } else if (i==2 & d$diff[2]==2 & d$br[1]!=1) {
    d$br[2] <- 1
  }
  if (d$diff[i]==2 & !any(sum(d$br[c(i-1, i-2)])>0)) d$br[i] <- 1
}
t(sapply(d$a[d$br==1], function(x) (x-2):x))
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    6    7    8
# [3,]    9   10   11
# [4,]   19   20   21
# [5,]   22   23   24

将所有内容包装到一个函数中,并使用另一个序列进行测试:

getConsec <- function(a) {
    d <- data.frame(a=a[-(1:2)], diff=diff(a, 2))
    d$br <- 0
    for (i in 1:nrow(d)) {
      if (i==1 & d$diff[1]==2) {
        d$br[1] <- 1
      } else if (i==2 & d$diff[2]==2 & d$br[1]!=1) {
        d$br[2] <- 1
      }
      if (d$diff[i]==2 & !any(sum(d$br[c(i-1, i-2)])>0)) d$br[i] <- 1
    }
    t(sapply(d$a[d$br==1], function(x) (x-2):x))
}

a <- sort(sample(1:30, 20))
 # [1]  1  2  3  4  6 10 12 14 15 16 17 18 19 20 21 23 25 27 28 30
getConsec(a)
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]   14   15   16
# [3,]   17   18   19

【讨论】:

  • getConsec 功能不可用,你能告诉我 d pckage
  • getConsec 正是我上面描述的功能。我编辑了我的答案以明确这一点。
  • 好的,我现在在更大的数据集上试试这个
  • 谢谢先生,我还有一个问题,我想复制这个函数来获得 60 个连续的值,我应该在哪里编辑,因为我是 r 代码的新手
【解决方案2】:

如果我理解正确,这应该可以完成工作

matrix(unique(a),ncol=3, byrow=T)

它会忽略重复的值,然后用它们逐行填充一个 3 列矩阵

【讨论】:

  • 不,它将所有元素粘贴到 3 列
  • 但这就是你的例子的作用?!
  • 不,您的方法是粘贴所有非必需元素
  • 从你的代码结果来看是 1 2 3 6 7 8 9 10 11 12 15 16 它不是连续的
  • 所以你只想要行中的序列?所以 12 15 16 不会在那里?
猜你喜欢
  • 2019-08-05
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2017-01-24
相关资源
最近更新 更多