【问题标题】:R time aggregate for multiple columns多列的 R 时间聚合
【发布时间】:2018-06-24 06:38:03
【问题描述】:

我添加了一个数据框,其中包含一次和 6 个数据列,如下所示...

df <- data.frame(structure(list(Time = c(100, 100.1, 100.2, 100.2, 100.3, 100.3,100.3, 100.4, 100.4, 100.5, 100.5, 100.6, 100.6, 100.7),
               x = c(4,NA, 7, NA, 3, 7, NA, 9, NA, 7, NA, 3, NA, 7),
               y = c(NA, 7, NA,9, NA, 9, 7, NA, NA, NA, 9, NA, 5, NA), 
               a = c(7, NA, 3, 3, NA,NA, 7, NA, NA, 7, 7, NA, NA, 9),
               b = c(8, NA, 4, NA, 5, 4, NA,9, NA, 1, NA, 7, NA, 2),
               j = c(NA, 4, NA, 6, NA, 6, 4, NA, NA, NA, 6, NA, 2, NA), 
               k = c(1, NA, 5, 5, NA, NA, 1, NA, NA, 2, 2,NA, NA, 6)), 
          .Names = c("Time", "x", "a", "j", "y", "b", "k"), 
          class = c("tbl_df","tbl", "data.frame"), row.names = c(NA, -14L)))


Time    x   y   a   b   j   k
100     4   NA  7   8   NA  1
100.1   NA  7   NA  NA  4   NA
100.2   7   NA  3   4   NA  5
100.2   NA  9   3   NA  6   5
100.3   3   NA  NA  5   NA  NA
100.3   7   9   NA  4   6   NA
100.3   NA  7   7   NA  4   1
100.4   9   NA  NA  9   NA  NA
100.4   NA  NA  NA  NA  NA  NA
100.5   7   NA  7   1   NA  2
100.5   NA  9   7   NA  6   2
100.6   3   NA  NA  7   NA  NA
100.6   NA  5   NA  NA  2   NA
100.7   7   NA  9   2   NA  6

我想使用时间列进行聚合。必须在 x 和 y、a 和 b、j 和 k 之间计算时间平均值。输出应该是这样的..

Time    xy_mean ab_mean jk_mean
100         
100.1           
100.2           
100.3           
100.4           
100.5           
100.6           
100.7           

请帮忙...

(如果问题不清楚也请评论)

【问题讨论】:

  • 两个问题:1)第一行,100 4加空格和100.4加点是一样的吗? 2) NA 7 的预期平均值是多少?
  • 感谢编辑,它解决了问题 1)。
  • 您好,感谢您的评论。 4 应该在第二列。预期平均值应为 7
  • 所以我的第二个问题平均变成了4 NA
  • 那么结果必须是 NA。很抱歉之前没有解释清楚。

标签: r time aggregate


【解决方案1】:

编辑

根据@Marijn Stevering 的评论,这种方法会更有效:

 df_final <- df %>% 
    group_by(Time) %>% 
   summarize(av_xy = mean(c(x,y), na.rm = TRUE), 
   av_ab = mean(c(a,b), na.rm = TRUE), 
   av_jk = mean(c(j,k), na.rm = TRUE))


df_final
## A tibble: 8 x 4
#   Time av_xy av_ab av_jk
#  <dbl> <dbl> <dbl> <dbl>
#1 100.0  6.00   NaN   4.0
#2 100.1   NaN   5.5   NaN
#3 100.2  5.50   7.5   4.0
#4 100.3  4.75   6.5   4.0
#5 100.4  9.00   NaN   NaN
#6 100.5  4.00   7.5   4.5
#7 100.6  5.00   3.5   NaN
#8 100.7  4.50   NaN   7.5

原始答案

我知道必须有更直接的东西,但这里有一个dplyr 方法,其中包含一些步骤:

library(dplyr)

df_xy <- df %>%
      group_by(Time) %>%
      summarise(av_xy = mean(c(x,y), na.rm = TRUE))

df_ab <- df %>%
      group_by(Time) %>%
      summarise(av_ab = mean(c(a,b), na.rm = TRUE))

df_jk <- df %>%
      group_by(Time) %>%
      summarise(av_jk = mean(c(j,k), na.rm = TRUE))
      
df_final <- df_xy %>%
  left_join(df_ab) %>%
  left_join(df_jk)

 df_final
## A tibble: 8 x 4
#   Time av_xy av_ab av_jk
#  <dbl> <dbl> <dbl> <dbl>
#1 100.0  6.00   NaN   4.0
#2 100.1   NaN   5.5   NaN
#3 100.2  5.50   7.5   4.0
#4 100.3  4.75   6.5   4.0
#5 100.4  9.00   NaN   NaN
#6 100.5  4.00   7.5   4.5
#7 100.6  5.00   3.5   NaN
#8 100.7  4.50   NaN   7.5

【讨论】:

  • 给出与na.rm = TRUE 相同的结果,并且更简单,点赞。但是请通过调用library 来启动脚本(尽管在文本中使用了哪个包。)
  • 对于最后一条命令 df_final R 返回错误(错误:by required,因为数据源没有公共变量)
  • @KathiravanMeeran 我不知道你的代码出了什么问题。使用您提供的数据对我有用。确保变量Time 在所有data.frame 中具有相同的时间。
  • @RuiBarradas 刚刚编辑了我的答案。谢谢你提醒我。
  • 您可以在一次汇总调用中创建所有 av 列,还可以节省您的加入:df_final2 &lt;- df %&gt;% group_by(Time) %&gt;% summarize(av_xy = mean(c(x,y), na.rm = TRUE), av_ab = mean(c(a,b), na.rm = TRUE), av_jk = mean(c(j,k), na.rm = TRUE))
【解决方案2】:

以下代码可以满足您的需求。它不漂亮,它使用split 将data.frame 拆分为Time 的子df,然后连续使用*apply 来计算结果。
如果要删除NA 值,请在代码开头设置NA.RM &lt;- TRUE

fun <- function(x, y, na.rm = FALSE){
    mean(c(x, y), na.rm = na.rm)
}

NA.RM <- FALSE

inx <- seq_along(names(df2))[2:4]
res <- lapply(split(df, df2$Time), function(DF)
            sapply(inx, function(i) fun(DF[[i]], DF[[i + 3]], NA.RM)))
res <- do.call(rbind, res)
res <- cbind.data.frame(row.names(res), as.data.frame(res))
row.names(res) <- NULL
names(res)[1] <- names(df2)[1]
names(res)[2:4] <- sapply(inx, function(i) paste0(names(df2)[i], names(df2)[i + 1]))
names(res)[2:4] <- paste(names(res)[2:4], "mean", sep = "_")
res
#   Time xy_mean ya_mean ab_mean
#1   100     6.0      NA     4.0
#2 100.1      NA     5.5      NA
#3 100.2      NA      NA     4.0
#4 100.3      NA      NA      NA
#5 100.4      NA      NA      NA
#6 100.5      NA      NA     4.5
#7 100.6      NA      NA      NA
#8 100.7     4.5      NA     7.5

【讨论】:

  • 非常感谢
猜你喜欢
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2022-01-19
  • 2015-05-17
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多