如何在r中减去两个数据框列的平均值“平均值(df1 $ a-df2 $ b)”

Posted

技术标签:

【中文标题】如何在r中减去两个数据框列的平均值“平均值(df1 $ a-df2 $ b)”【英文标题】:how to do the mean of two dataframes columns to be subtrated "mean(df1$a-df2$b)" in r 【发布时间】:2021-12-04 09:38:24 【问题描述】:

我的两个数据框如下所示:

> dput(head(df1,25))
structure(list(Date = structure(c(16644, 16645, 16646, 16647, 
16648, 16649, 16650, 16651, 16652, 16653, 16654, 16655, 16656, 
16657, 16658, 16659, 16660, 16661, 16662, 16663, 16664, 16665, 
16666, 16667, 16668), class = "Date"), AU = c(0.241392906920806, 
0.257591745069017, 0.263305712230276, NaN, 0.252892547032525, 
0.251771180928526, 0.249211746794207, 0.257289083109259, 0.205017582640463, 
0.20072274573488, 0.210154167590338, 0.207384553271337, 0.193725450540089, 
0.199282601988984, 0.216267134143314, 0.217052471451736, NaN, 
0.220703029531909, 0.2164619798534, 0.223442036108148, 0.22061326758891, 
NaN, 0.277777461504811, NaN, 0.200839628485262)), row.names = c(NA, 
-25L), class = c("tbl_df", "tbl", "data.frame"))

> dput(head(df2,25))
structure(list(UF1 = c(0.2559, 0.2565, 0.257, 0.2577, 0.2583, 
0.259, 0.2596, 0.2603, 0.2611, 0.2618, 0.2625, 0.2633, 0.2641, 
0.2649, 0.2657, 0.2665, 0.2674, 0.2682, 0.2691, 0.27, 0.2709, 
0.2718, 0.2727, 0.2736, 0.2745), UF2 = c(0.2597, 0.2602, 0.2608, 
0.2614, 0.2621, 0.2627, 0.2634, 0.2641, 0.2648, 0.2655, 0.2663, 
0.267, 0.2678, 0.2686, 0.2694, 0.2702, 0.2711, 0.2719, 0.2728, 
0.2737, 0.2745, 0.2754, 0.2763, 0.2773, 0.2782), UF3 = c(0.2912, 
0.2915, 0.2918, 0.2922, 0.2926, 0.293, 0.2934, 0.2938, 0.2943, 
0.2947, 0.2952, 0.2957, 0.2962, 0.2968, 0.2973, 0.2979, 0.2985, 
0.2991, 0.2997, 0.3003, 0.3009, 0.3016, 0.3022, 0.3029, 0.3035
), Date = structure(c(16644, 16645, 16646, 16647, 16648, 16649, 
16650, 16651, 16652, 16653, 16654, 16655, 16656, 16657, 16658, 
16659, 16660, 16661, 16662, 16663, 16664, 16665, 16666, 16667, 
16668), class = "Date")), row.names = c(NA, 25L), class = "data.frame")
>

我想做两个不同数据帧列的平均值减去 (mean(df1$AU-df2$UF))。 最接近我得到的解决方案如下:

data.frame(mean = colMeans(df1$AU, na.rm = TRUE) - colMeans(df2$UF))

但我收到了这个错误:

Error in colMeans(df1$mAU, na.rm = TRUE) : 
  'x' must be an array of at least two dimensions

我成功地只为每列一列的数据帧运行相同的代码,但由于我每个数据帧有 3 列或更多列,我想针对 df1$AU 进行计算,我需要提高效率。

任何帮助将不胜感激。谢谢。

【问题讨论】:

有 3 列 UF1UF2UF3 但没有 UF 我认为这个问题需要澄清。你在寻找手段之间的区别吗?差异的平均值?别的东西..?其中每一个都需要根据您的数据采用不同的方法。 我对我的问题进行了一些编辑。我想要 "mean(df1$AU-df2$UF" 而不是 "mean=(df1$AU-df2$UF" 这意味着平均值之间的差异 【参考方案1】:

假设您的意思是您希望将df1 中的(数字)列的平均值与df2 中的(数字)列的平均值相减,可以这样做:

mean(df1$AU, na.rm = T) - colMeans(df2[,1:3], na.rm = T)

这个输出:

       UF1        UF2        UF3 
-0.0367389 -0.0404509 -0.0688949

df2的每列

我希望这会有所帮助。

【讨论】:

这取决于想要的输出,因为问题很模糊,我建议了一个通用的解决方案。 你说得对,问题很模糊。我将删除我之前的评论并发布另一条,更好地解释。 如果 NANaN 位于不同的位置,或者如果一个向量中的数量多于其他向量,则向量元素方面的差异将不一样.我相信假设 OP 想要差异 x[1]-y[1]x[2]-y[2] 等,然后是这个向量的平均值更有意义。【参考方案2】:

这里有两个基本的 R 函数来计算差异的平均值。第二个更快。

meanDiffs1 <- function(x, y, na.rm = TRUE)
  z <- if(na.rm) na.omit(cbind(x, -1*y)) else cbind(x, -1*y)
  mean(rowSums(z))

meanDiffs2 <- function(x, y, na.rm = TRUE)
  if(na.rm)
    i <- is.na(x)
    j <- is.na(y)
    mean(x[!i & !j] - y[!i & !j])
   else 
    mean(x - y)
  


meanDiffs(df1$AU, df2$UF1)
#[1] -0.0361429
meanDiffs2(df1$AU, df2$UF1)
#[1] -0.0361429

要计算df1$AUdf$UF* 之间的所有平均差,请使用sapply

sapply(df2[1:3], \(y) meanDiffs2(df1$AU, y))
#        UF1         UF2         UF3 
#-0.03614290 -0.03986195 -0.06848576 

【讨论】:

以上是关于如何在r中减去两个数据框列的平均值“平均值(df1 $ a-df2 $ b)”的主要内容,如果未能解决你的问题,请参考以下文章

python groupby图的长度不匹配错误

如何在此数据框列的 R 中正确使用 apply?

具有 nans 的数据框列的移动平均值

将一些函数应用于列表中的数据框列

如何从 Pandas 数据框列中的日期时间减去 3 小时?

如何截断火花数据框列的值? [复制]