【发布时间】:2021-08-30 18:19:17
【问题描述】:
我有一个土壤特性数据表,其中包含不同位置和深度的值。有些值是 NA 所以我想得到考虑到上层和下层的平均值。在顶层的情况下,我会从下一层取值。
我能够创建一个列来指示每一行的上层和下层,并且我想进行自我合并。但是我完全不知道如何进行。
关于如何做到这一点的任何线索? Bellow 是一个示例 data.table 以及我想要实现的目标。该示例考虑具有 3 层的两个位置。但我有多个位置,有些位置比其他位置多。
library(data.table)
# I was able to identify which are the botton and top layers
# using a function to identify the neighboors
dt <- data.table(id = rep(c(1,2), 1, each = 3),
depth = c(10, 20, 30, 10, 20, 30),
val = c(12, 18, 11, 25, 27, 29),
bot_l = c(20, 30, NA, 20, 30, NA),
top_l = c(NA, 10, 20, NA, 10, 20))
# How can I calculate the average between top and lowe layers?
dt_desired <- data.table(id = rep(c(1,2), 1, each = 3),
depth = c(10, 20, 30, 10, 20, 30),
val = c(12, 18, 11, 25, 27, 29),
bot_l = c(20, 30, NA, 20, 30, NA),
top_l = c(NA, 10, 20, NA, 10, 20)
mean_top_bot = c(18, 11.5, 18, 27, 27, 27))
再解释一下:
- mean_top_bot[1] = val[depth = 0] + val[depth = 20]。由于我在深度 0 处没有值,因此将变为 (NA + 18)/2 = 18 (rm.na = TRUE)
- mean_top_bot[2] = val[depth=10] + val[depth=30] = (12+11)/2
- 我手动计算了
mean_top_bot值。这就是为什么我有一些错误:facepal:
使用自合并的解决方案
通过更改by.x 和 by.y`参数,我能够将表格与自身合并。但我有一种感觉,我正在以最糟糕的方式这样做。
dt1 <- merge(dt, dt[, .SD, .SDcols = !c('bot_l', 'top_l')],
by.x = c('id', 'bot_l'),
by.y = c('id', 'depth'),
all = TRUE)[order(id, depth)]
id bot_l depth val.x top_l val.y
1: 1 20 10 12 NA 18
2: 1 30 20 18 10 11
3: 1 NA 30 11 20 NA
4: 1 10 NA NA NA 12
5: 2 20 10 25 NA 27
6: 2 30 20 27 10 29
7: 2 NA 30 29 20 NA
8: 2 10 NA NA NA 25
有没有更简单的方法来做到这一点?
【问题讨论】:
-
这些数字在 mean_top_bot 中是否正确,即你能显示到达 18 的计算吗
-
可能与@akrun的评论有关,但为什么两个表中的
val列不一样? -
哎呀,我想出的示例中有错误。相应地更新了问题。使用
merge和by.x和by.y参数我也得到了一些不错的结果。但我不确定这是最好的解决方案
标签: r data.table