【问题标题】:R programming: more flexible version of this for loopR 编程:这个 for 循环的更灵活的版本
【发布时间】:2015-01-14 00:49:45
【问题描述】:

下面是我的 R 代码,它接受向量 a 并返回向量 b。向量 b 应该是具有特定格式的向量 a 的唯一标识符。请注意,a 是按所有相同的数字并排排列的。

a <- c(1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 6, 6, 6, 7, 8, 9, 9)
b <- NULL


for(i in 5:length(a)){
        if (a[i] == a[i - 1] & a[i] == a[i - 2] & a[i] == a[i - 3] & a[i] == a[i - 4])
            b[i] <- paste(a[i], "-", 4, sep="")
        else if (a[i] == a[i - 1] & a[i] == a[i - 2] & a[i] == a[i - 3])
            b[i] <- paste(a[i], "-", 3, sep="")
        else if (a[i] == a[i - 1] & a[i] == a[i - 2])
            b[i] <- paste(a[i], "-", 2, sep="")
        else if (a[i] == a[i - 1])
            b[i] <- paste(a[i], "-", 1, sep="")
        else 
            b[i] <- paste(a[i], "-", 0, sep="")
}

#The first 4 values in vector b have to manually entered 
#because the for loop checks up to 4 consecutive numbers in a
b[1] <- "1-0" 
b[2] <- "1-1"
b[3] <- "1-2"
b[4] <- "2-0"

b

上面的代码根据需要返回 b,但是,如果向量 a 有超过 4 个相同的连续数字,那么 for 循环将产生包含一些相同元素的 b。如何改进这个 for 循环,以便可以为任意数量的相同连续数字赋予适当的唯一标识符。

我正在考虑使用某种嵌套的 for 循环,但是如何在 if 语句中完成呢?

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    这可能会替换您当前的循环。 rle() 用于为a 的每个唯一元素构造一个序列,从零开始。然后我们可以将paste()- 分隔符一起使用。

    paste(a, sequence(rle(a)$lengths) - 1, sep = "-")
    #  [1] "1-0" "1-1" "1-2" "2-0" "2-1" "2-2" "3-0" "4-0" "5-0" "6-0" "6-1"
    # [12] "6-2" "6-3" "7-0" "8-0" "9-0" "9-1"
    

    这与b 的输出相同

    【讨论】:

      【解决方案2】:

      使用avepaste,我现在意识到这基本上只是@RichardScriven 答案的一种变体:

      paste(a, ave(a,a,FUN=seq_along) - 1, sep="-")
      # [1] "1-0" "1-1" "1-2" "2-0" "2-1" "2-2" "3-0" "4-0" "5-0" "6-0" "6-1"
      #[12] "6-2" "6-3" "7-0" "8-0" "9-0" "9-1"
      

      【讨论】:

        【解决方案3】:
        # If you are sure the different groups are really sorted, this will work:
        b <- tapply(1:length(a), a, FUN = function(x) (1:length(x)) -1 )
        b <- paste(a, unlist(b), sep = "-")
        

        【讨论】:

        • 它适用于这个实例,但当你想要一个向量而不是返回一个列表时,通常avetapply 更可取。
        猜你喜欢
        • 2019-03-07
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-01
        • 2021-11-18
        • 2020-07-16
        • 2017-09-27
        相关资源
        最近更新 更多