根据列中的其他值填充 NA 值
Filling in NA values based on other values in the column
我有一个 data.table 有大量缺失值。我想通过从 data.table 中的可用值中添加或减去值来填充这些值。特别是,请考虑以下数据:
> test = data.table(id=c("A","A","A","A","A","B","B","B","B","B"), x=c(NA,NA,0,NA,NA,NA,NA,0,NA,NA))
> test
id x
1: A NA
2: A NA
3: A 0
4: A NA
5: A NA
6: B NA
7: B NA
8: B 0
9: B NA
10: B NA
我需要一个将这个转换成那个的操作:
id x
1: A -2
2: A -1
3: A 0
4: A 1
5: A 2
6: B -2
7: B -1
8: B 0
9: B 1
10: B 2
基本上是 na.locf 的一个版本,它增加最后一个值而不是重复它。
我们可以按'id'分组,取行号(seq_len(.N)
)与'x'中的位置(which
)的差值为0 (!x
)。我用 as.numeric
换行,因为 'x' 列在输入数据集中是 numeric
,但从差异来看,它被转换为 'integer'。如果在分配 (:=
) 时 class
发生冲突,data.table 将显示错误,因为它需要匹配 class
.
test[, x:= as.numeric(seq_len(.N)-which(!x)), id]
test
# id x
# 1: A -2
# 2: A -1
# 3: A 0
# 4: A 1
# 5: A 2
# 6: B -2
# 7: B -1
# 8: B 0
# 9: B 1
#10: B 2
!x
另外写成x==0
更清楚。它 returns 是 TRUE/FALSE
的逻辑向量。如果有 NA
个值,它将保持为 NA
。通过用 which
换行,我们得到 0
值的位置。在示例中,每个 'id'.
为 3
我有一个 data.table 有大量缺失值。我想通过从 data.table 中的可用值中添加或减去值来填充这些值。特别是,请考虑以下数据:
> test = data.table(id=c("A","A","A","A","A","B","B","B","B","B"), x=c(NA,NA,0,NA,NA,NA,NA,0,NA,NA))
> test
id x
1: A NA
2: A NA
3: A 0
4: A NA
5: A NA
6: B NA
7: B NA
8: B 0
9: B NA
10: B NA
我需要一个将这个转换成那个的操作:
id x
1: A -2
2: A -1
3: A 0
4: A 1
5: A 2
6: B -2
7: B -1
8: B 0
9: B 1
10: B 2
基本上是 na.locf 的一个版本,它增加最后一个值而不是重复它。
我们可以按'id'分组,取行号(seq_len(.N)
)与'x'中的位置(which
)的差值为0 (!x
)。我用 as.numeric
换行,因为 'x' 列在输入数据集中是 numeric
,但从差异来看,它被转换为 'integer'。如果在分配 (:=
) 时 class
发生冲突,data.table 将显示错误,因为它需要匹配 class
.
test[, x:= as.numeric(seq_len(.N)-which(!x)), id]
test
# id x
# 1: A -2
# 2: A -1
# 3: A 0
# 4: A 1
# 5: A 2
# 6: B -2
# 7: B -1
# 8: B 0
# 9: B 1
#10: B 2
!x
另外写成x==0
更清楚。它 returns 是 TRUE/FALSE
的逻辑向量。如果有 NA
个值,它将保持为 NA
。通过用 which
换行,我们得到 0
值的位置。在示例中,每个 'id'.
3