【问题标题】:R: How to compare values in a column with later values in the same columnR:如何将列中的值与同一列中的后续值进行比较
【发布时间】:2021-12-10 03:30:00
【问题描述】:

我正在尝试使用 R 中的大型数据集,我需要创建一个列,将现有列中的值与其后面的所有值进行比较(例如:第 1 行需要比较第 1-10,000 行,第 2 行需要比较第 2-10,000 行,第 3 行需要比较第 3-10,000 行等),但不知道如何写范围。

我目前有一列原始数值和一列由以下生成的行值:

samples$row = seq.int(nrow(samples))

我尝试使用以下命令生成列:

samples$processed = min(samples$raw[samples$row:10000])

但得到错误“数值表达式有 10000 个元素:仅使用第一个元素”,并且生成的列仅具有针对 10,000 行中的每一行重复的第 1 行的值。

我需要如何编写这个命令,以便范围的下限是当前正在计算的行而不是 1?

任何帮助将不胜感激,因为我的编程经验很少。

【问题讨论】:

    标签: r


    【解决方案1】:

    如果您只需要特定行和所有后续行的min,那么

    rev(cummin(rev(samples$val)))
    #  [1]  24  24  24  24  24  24  24  24  24  24  24  24 165 165 165 165 410 410 410 882
    

    如果您有一些没有 cumulative 变体的其他函数(并且您对 min 的使用只是一个占位符),那么其中之一:

    mapply(function(a, b) min(samples$val[a:b]), seq.int(nrow(samples)), nrow(samples))
    #  [1]  24  24  24  24  24  24  24  24  24  24  24  24 165 165 165 165 410 410 410 882
    
    sapply(seq.int(nrow(samples)), function(a) min(samples$val[a:nrow(samples)]))
    

    使用mapply 而不是sapply 的唯一原因是,如果出于某种原因,您想要类似窗口的操作,而不是总是进入框架的底部。 (虽然如果你想要 Windows,我建议使用 zooslider 包。)


    数据

    set.seed(42)
    samples <- data.frame(val = sample(1000, size=20))
    samples
    #    val
    # 1  561
    # 2  997
    # 3  321
    # 4  153
    # 5   74
    # 6  228
    # 7  146
    # 8  634
    # 9   49
    # 10 128
    # 11 303
    # 12  24
    # 13 839
    # 14 356
    # 15 601
    # 16 165
    # 17 622
    # 18 532
    # 19 410
    # 20 882
    

    【讨论】:

    • 完美解决了问题,非常感谢您的帮助!
    • 不用着急,但既然你是新来的……当一个答案解决了你的问题时,请accept it; ;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。 一般而言(此处尚不相关),尽管您只能接受一个答案,但您可以选择对您认为有帮助的尽可能多的人进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2021-11-05
    • 2021-02-22
    • 1970-01-01
    • 2019-04-19
    相关资源
    最近更新 更多