根据另一列的值平均一列的特定行

时间:2019-09-05 21:20:13

标签: r

我有一个连续使用两种技术的测量数据集,这意味着一种技术半小时,另一种技术一小时(以下数据)。

我想比较这两种技术,因此需要从两个数据集中得到一个点(每1.5小时)。

我想获取第5列,其中第2列的第1列和第3列的平均值位于位置第2列,这意味着第16列30时间戳的第4列的平均值为16:00和17:00,以便进行比较第2列和第5列。

table with sample data

1 个答案:

答案 0 :(得分:1)

假设注释中显示了DF。然后,假设您要用最接近的非NA的线性插值替换NA,并简单地扩展非NA来填充开头和结尾的值:

library(zoo)

replace(DF, 2:3, na.approx(DF[-1], rule = 2))

给予:

##   V1       V2  V3
## 1  A 1.000000 1.0
## 2  B 1.000000 1.5
## 3  C 1.333333 2.0
## 4  D 1.666667 3.0
## 5  E 2.000000 3.5
## 6  F 2.333333 4.0
## 7  G 2.666667 5.0
## 8  H 3.000000 5.0

如果要获取最接近的NA的平均值,则向前和向后使用na.locf,然后对它们进行平均,最后使用na.fill填充四肢。

library(zoo)

replace(DF, 2:3, na.fill(
                     (na.locf(DF[-1], na.rm = FALSE) + 
                      na.locf(DF[-1], fromLast = TRUE, na.rm = FALSE))/2, 
                    "extend"))

##   V1  V2  V3
## 1  A 1.0 1.0
## 2  B 1.0 1.5
## 3  C 1.5 2.0
## 4  D 1.5 3.0
## 5  E 2.0 3.5
## 6  F 2.5 4.0
## 7  G 2.5 5.0
## 8  H 3.0 5.0

另一种方法是使用样条线。参见?na.spline

注意

DF <- data.frame(V1 = head(LETTERS, 8), V2 = c(NA, 1, NA, NA, 2, NA, NA, 3),
  V3 = c(1, NA, 2, 3, NA, 4, 5, NA))