当首次观察到液位系数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]