【问题标题】:add index column based on variable length rows基于可变长度行添加索引列
【发布时间】:2013-12-28 02:23:57
【问题描述】:

这可能是一个简单的问题,但我一直无法找到答案。我的问题是如何根据可变行长添加索引列。例如,在下面的数据框中,我试图添加第三列,每次切换序列时,索引号都会增加。采样序列 6:29 = Setnum 1、34:50 = Setnum 2、56:79 = Setnum 3、84:100 = Setnum 4 等

Sample <- rep(c(6:29, 34:50, 56:79, 84:100, 106:129, 134:150), each=1, times=8)
set.seed(123)
randdf <- data.frame(area = round(rnorm(984, mean = 1000000, sd = 100000)), Sample)

我希望结束的是每个样本序列的运行计数,直到数据帧结束,无论样本序列集的数量如何。

Sample   Setnum  area
6        1       
7        1       
...      1
29       1
34       2
35       2
...      2
50       2
...      3...5
134      6
135      6
...      6
150      6
6        7
7        7
...
134      8
135      8

每个 Sample 序列的开始和结束编号是相同的。但是由于缺少数据,每个 Sample 序列中的观测值数量并不相同。

我认为我需要在每个 Sample 序列(6、34、56、84 等)的开头使用“split”,然后使用“cumsum”?以下代码的效果:

cumsum(randdf[,1]=="6" | "34" | "56" | "84" | etc)
IndexDF <- split(randdf, cumsum(randf[,1]=="6"| etc))
## Setnum is the name of the index column
for(i in 1:length(IndexDF)) {IndexDF[[i]] <-cbind(IndexDF[[i]], 
Setnum=rep(i, nrow(IndexDF[[i]])))}

我希望我的问题很清楚。感谢您的帮助。

【问题讨论】:

    标签: r indexing subset


    【解决方案1】:

    根据@agstudy 的回答,您需要这样做:

    randdf$Setnum  = cumsum(c(1,diff(randdf$Sample)!=1))
    

    只有在样本大小之间存在跳跃时才会起作用,因此在更改组时差异不是1。

    【讨论】:

    • 感谢您的脚本!它的工作原理是我正在寻找要累积计数的组。如所写,由切割点标识的每个组都编号为 1 到 6 并重复。如何计算对未知组数的削减?
    • 我没收到问题,试试这个新问题。
    • 成功了!非常感谢。我在这个问题上苦苦挣扎了 2 天。
    【解决方案2】:

    例如:

    cumsum(c(1,diff(sample)!=1)+1
    

    【讨论】:

    • 感谢您的回答。但作为 R 新手,我不明白在哪里以及如何应用此代码。它没有像写的那样工作。这应该替换我的伪代码的第一行还是第二行?
    • 来吧。您只需将其分配给一个新的 data.frame 变量。无论我看到其他答案添加此作业。
    猜你喜欢
    • 2020-08-30
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多