我试图使用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?
任何帮助都将不胜感激,因为我有最少的编程经验。
发布于 2021-12-09 19:30:00
如果您只需要特定行的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如果您有一些没有cum累积变量的其他函数(并且您对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 over sapply的唯一原因是,出于某种原因,您希望使用类似窗口的操作,而不是总是位于帧的底部。(不过,如果您想要windows,我建议您使用zoo或slider包。)
数据
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 882https://stackoverflow.com/questions/70295594
复制相似问题