R 如果为else,则按键使用列中的下一个唯一值

R 如果为else,则按键使用列中的下一个唯一值,r,data.table,R,Data.table,我有个问题。如何对sampdata对象执行以下操作?我希望得到的结果是sampres对象 多谢各位 伪代码: if sampdata[,flow[1] == flow[2], by = site_no] sampdata[,flow[2]] = next unique flow value & take the corresponding gage value # if yes no change # if no 起始数据: library(data.table) sampd

我有个问题。如何对sampdata对象执行以下操作?我希望得到的结果是sampres对象

多谢各位

伪代码:

if sampdata[,flow[1] == flow[2], by = site_no]

sampdata[,flow[2]] = next unique flow value & take the corresponding gage value # if yes

no change   # if no
起始数据:

library(data.table)

sampdata <-     data.table(c(02446500,02446500,02446500,02467000,02467000,02467000,06818000,06818000,06818000,06818000,06893000,06893000,06893000,06893000,06934500,06934500,06934500,07010000,07010000,07010000,07289000,07289000,07289000),c(21,21,22,70,76,82,14700,14700,14700,14800,11000,11000,11000,11100,19400,19400,19500,32000,32000,32100,146000,146000,147000),c(4,4.01,4.02,73.05,73.06,73.07,1,1.01,1.02,1.03,1,1.01,1.02,1.03,-1.2,-1.19,-1.18,-9.02,-9.01,-9,-4.43,-4.42,-4.41))
setnames(sampdata,c("site_no", "flow", "gage"))
setkey(sampdata, site_no)
谢谢你的编辑。我在相同的流量/压力表组合中添加了粗体。下一个唯一流量值和相应的计量值需要成为第二个新流量/新计量值


这是一小部分数据,我正试图找到一个自动化的解决方案,因为我是手工修改的。我正试图确定一种自动进行更改的方法,因为我有数千个站点需要处理。谢谢。

这个功能是在我意识到这只是一个狭窄的网站群之前设计的,但它仍然有效:

swapfun <- function(x){ samp <- rle(x); 
              unlist( sapply(
                         seq_along(samp$lengths), 
                             function(x) {
                                t <- rep(samp$values[x], samp$lengths[x])
                                if(samp$lengths[x] >1) {t[2] <- samp$values[x+1]}
                                t}
                             )
                     )
                          }

sampdata[ , newflow:=swapfun(flow), by=site_no]
> sampdata
    site_no   flow  gage newflow
 1: 2446500     21  4.00      21
 2: 2446500     21  4.01      22
 3: 2446500     22  4.02      22
 4: 2467000     70 73.05      70
 5: 2467000     76 73.06      76
 6: 2467000     82 73.07      82
 7: 6818000  14700  1.00   14700
 8: 6818000  14700  1.01   14800
 9: 6818000  14700  1.02   14700
10: 6818000  14800  1.03   14800
11: 6893000  11000  1.00   11000
12: 6893000  11000  1.01   11100
13: 6893000  11000  1.02   11000
14: 6893000  11100  1.03   11100
15: 6934500  19400 -1.20   19400
16: 6934500  19400 -1.19   19500
17: 6934500  19500 -1.18   19500
18: 7010000  32000 -9.02   32000
19: 7010000  32000 -9.01   32100
20: 7010000  32100 -9.00   32100
21: 7289000 146000 -4.43  146000
22: 7289000 146000 -4.42  147000
23: 7289000 147000 -4.41  147000

swapfun好吧,这绝对是一个
rle
类的问题。有一件事你没有明确说明,那就是“gage”是如何变化的。我猜你是从获得“下一个唯一流量值”的同一位置取值的?@Frank是的,我是从获得下一个唯一流量值的仪表值取新仪表值的。到目前为止,我已经尝试了unique(流量),但我不知道如何在这些独特的流量点获得相应的量规值。好的。仅供参考,粗体似乎没有在代码块内呈现,可能只是在每个受影响(或未受影响)行的末尾添加了一个星号?谢谢您的功能。新流量是我所需要的,但是没有一种方法也可以在该流量值处获取相应的仪表&并非所有的唯一流量值都出现在+1处。这意味着什么:
并非所有的唯一流量值都出现在+1处
?并且。。。前面问题的答案是否意味着您需要使您的示例更加复杂,以准确地表示该问题?
    site_no   flow  gage site_no   flow  gage
 1: 2446500     21  4.00 2446500     21  4.00
 2: 2446500     21  4.01 2446500     22  4.02
 3: 2446500     22  4.02 2446500     22  4.02
 4: 2467000     70 73.05 2467000     70 73.05
 5: 2467000     76 73.06 2467000     76 73.06
 6: 2467000     82 73.07 2467000     82 73.07
 7: 6818000  14700  1.00 6818000  14700  1.00
 8: 6818000  14700  1.01 6818000  14800  1.03
 9: 6818000  14700  1.02 6818000  14700  1.02
10: 6818000  14800  1.03 6818000  14800  1.03
11: 6893000  11000  1.00 6893000  11000  1.00
12: 6893000  11000  1.01 6893000  11100  1.03
13: 6893000  11000  1.02 6893000  11000  1.02
14: 6893000  11100  1.03 6893000  11100  1.03
15: 6934500  19400 -1.20 6934500  19400 -1.20
16: 6934500  19400 -1.19 6934500  19500 -1.18
17: 6934500  19500 -1.18 6934500  19500 -1.18
18: 7010000  32000 -9.02 7010000  32000 -9.02
19: 7010000  32000 -9.01 7010000  32100 -9.00
20: 7010000  32100 -9.00 7010000  32100 -9.00
21: 7289000 146000 -4.43 7289000 146000 -4.43
22: 7289000 146000 -4.42 7289000 147000 -4.41
23: 7289000 147000 -4.41 7289000 147000 -4.41
    site_no   flow  gage site_no   flow  gage
swapfun <- function(x){ samp <- rle(x); 
              unlist( sapply(
                         seq_along(samp$lengths), 
                             function(x) {
                                t <- rep(samp$values[x], samp$lengths[x])
                                if(samp$lengths[x] >1) {t[2] <- samp$values[x+1]}
                                t}
                             )
                     )
                          }

sampdata[ , newflow:=swapfun(flow), by=site_no]
> sampdata
    site_no   flow  gage newflow
 1: 2446500     21  4.00      21
 2: 2446500     21  4.01      22
 3: 2446500     22  4.02      22
 4: 2467000     70 73.05      70
 5: 2467000     76 73.06      76
 6: 2467000     82 73.07      82
 7: 6818000  14700  1.00   14700
 8: 6818000  14700  1.01   14800
 9: 6818000  14700  1.02   14700
10: 6818000  14800  1.03   14800
11: 6893000  11000  1.00   11000
12: 6893000  11000  1.01   11100
13: 6893000  11000  1.02   11000
14: 6893000  11100  1.03   11100
15: 6934500  19400 -1.20   19400
16: 6934500  19400 -1.19   19500
17: 6934500  19500 -1.18   19500
18: 7010000  32000 -9.02   32000
19: 7010000  32000 -9.01   32100
20: 7010000  32100 -9.00   32100
21: 7289000 146000 -4.43  146000
22: 7289000 146000 -4.42  147000
23: 7289000 147000 -4.41  147000