Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当首次观察到液位系数R时,替换为0_R_Replace_Row - Fatal编程技术网

当首次观察到液位系数R时,替换为0

当首次观察到液位系数R时,替换为0,r,replace,row,R,Replace,Row,我有这个样本: data <- structure(list(mmsi = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), tr = c(1, 1, 1, 0, 2, 2, 0, 4, 4, 0, 5, 5)), .Names = c("mmsi", "tr"), row.names = c(NA, -12L), clas

我有这个样本:

data <- structure(list(mmsi = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), 
    tr = c(1, 1, 1, 0, 2, 2, 0, 4, 4, 0, 5, 5)), .Names = c("mmsi", 
"tr"), row.names = c(NA, -12L), class = "data.frame")
但是当我使用更大的样本时,会出现一个问题:如果第一个值是0,那么我有一个错误(因为它找不到以前的值…)

例如,如果我用

data <- structure(list(mmsi = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), 
    tr = c(0, 1, 1, 0, 2, 2, 0, 4, 4, 0, 5, 5)), .Names = c("mmsi", 
"tr"), row.names = c(NA, -12L), class = "data.frame")
-->函数无法替换值I更改(列
tr
中的第一个值)

我想我需要在我的函数中再多一行来编辑第一个0,当它们作为
tr
中的第一级出现时。新行应使用以下非零值替换0。那么函数的其余部分就可以了

我要寻找的新专栏的输出是:

data$test
 [1] 1 1 1 1 2 2 2 4 4 4 5 5

您知道如何获取此信息吗?

我们可以使用group by函数中的一个函数来完成此操作。将'data.frame'转换为'data.table'(
setDT(data)
),按'mmsi'分组,在将'0'值替换为'na'并使用选项
na.rm=FALSE
后,应用
na.locf
(来自
zoo
)来替换起始0(也称为na)到下一个值

library(data.table)
library(zoo)
setDT(data)[, test := na.locf(na.locf(replace(tr, tr==0, NA), 
                   na.rm=FALSE), fromLast=TRUE), by = mmsi]
data
#    mmsi tr test
# 1:    a  0    1
# 2:    a  1    1
# 3:    a  1    1
# 4:    a  0    1
# 5:    a  2    2
# 6:    a  2    2
# 7:    a  0    2
# 8:    b  4    4
# 9:    b  4    4
#10:    b  0    4
#11:    b  5    5
#12:    b  5    5

我们也可以不使用
na.locf

setDT(data)[, test := pmax(pmax(tr, shift((NA^!tr) * tr), na.rm = TRUE),1), mmsi]

很好,它似乎工作得很好(使用
tr
is numeric;)。我尝试使用
为(I in levels(data$mmsi)){data$test=data$rl[!!data$rl][cumsum(!!data$rl)+1]data$test[is.na(data$test)]
library(data.table)
library(zoo)
setDT(data)[, test := na.locf(na.locf(replace(tr, tr==0, NA), 
                   na.rm=FALSE), fromLast=TRUE), by = mmsi]
data
#    mmsi tr test
# 1:    a  0    1
# 2:    a  1    1
# 3:    a  1    1
# 4:    a  0    1
# 5:    a  2    2
# 6:    a  2    2
# 7:    a  0    2
# 8:    b  4    4
# 9:    b  4    4
#10:    b  0    4
#11:    b  5    5
#12:    b  5    5
setDT(data)[, test := pmax(pmax(tr, shift((NA^!tr) * tr), na.rm = TRUE),1), mmsi]