【问题标题】:How to count the number of consecutive numbers in a data.frame?如何计算data.frame中连续数字的数量?
【发布时间】:2014-11-14 14:42:39
【问题描述】:

顺便说一句,我正在使用 R 编程。

假设我有一个这样的数据框。

        row.names   Tx    Hx     Tn
1        51        33.9  43.48  24.9
2        52        33.0  41.03  22.5
3        64        32.8  37.74  23.3
4        65        32.7  44.53  22.3
5        66        34.9  42.43  23.5
6        77        33.6  38.74  21.8
7        78        34.6  45.46  27.1
8        84        32.9  41.67  24.1
9        85        35.1  43.15  25.0
10      117        32.0  37.11  20.0

我试图弄清楚在 row.names 列中出现了多少次两个或更多连续数字和三个或更多连续数字。

因此,对于此示例,依次为 51、52、64、65、66,然后是 77、78,最后是 84、85。我只想计算两个或更多连续数字和三个或更多连续数字发生了多少次。

我的结果是

2+ = 4
3+ = 1

提前感谢您的帮助!

【问题讨论】:

  • 试试cumsum(rev(table(table(cumsum(c(TRUE,diff(df$row.names)!=1))))))
  • 另见 seqle 来自“cgwtools”包:cgwtools::seqle(DF$row.names);然后,您可以为每个所需的“>= n”申请table

标签: r matrix dataframe


【解决方案1】:
tmp <- table(rle(cumsum(c(1L, diff(DF$row.names)) != 1L))$lengths)
cumsum(rev(tmp))
#3 2 1 
#1 4 5

【讨论】:

  • @Nick Driscoll 它确实适用于您提供的示例。如果它不起作用,您应该提供更多详细信息。
  • “不起作用”不是一个有用的评论。考虑将您的数据作为dput 输出提供,因为这很可能是数据格式问题。例如,您可能需要as.integer(DF$row.names)
  • 如果它不起作用,你为什么接受它作为答案?
  • 因为 row.names 是 NULL 类,一旦我将其更改为整数,它就起作用了 :)
  • Class NULL 表示它们不存在。但是很高兴您能够解决这个问题(但是您设法做到了)。
【解决方案2】:

我一直在为此苦苦挣扎,直到我看到@akrun 的评论。我从那里开始并做了一些修改。这有效:

df <- structure(list(
    row.names = c(51L, 52L, 64L, 65L, 66L, 77L, 78L, 84L, 85L, 117L), 
    Tx = c(33.9, 33, 32.8, 32.7, 34.9, 33.6, 34.6, 32.9, 35.1, 32), 
    Hx = c(43.48, 41.03, 37.74, 44.53, 42.43, 38.74, 45.46, 41.67, 43.15, 37.11), 
    Tn = c(24.9, 22.5, 23.3, 22.3, 23.5, 21.8, 27.1, 24.1, 25, 20)), 
    .Names = c("row.names", "Tx", "Hx", "Tn"), class = "data.frame", 
    row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"))

delta <- c(0, diff(df$row.names))
tally <- cumsum(delta!=1)
count <- table(table(tally[delta==1])+1)
twoplus <- sum(count[names(count) > 1.999])
threeplus <- sum(count[names(count) > 2.999])
twoplus
threeplus

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多