r - 如何在r中减去两个数据框列的平均值“平均值(df1 $ a-df2 $ b)”
问题描述
我的两个数据框如下所示:
> 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
我需要更高效。
任何帮助都感激不尽。谢谢你。
解决方案
这里有两个基本的 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$AU
要计算和之间的所有平均差df$UF*
,请使用sapply
。
sapply(df2[1:3], \(y) meanDiffs2(df1$AU, y))
# UF1 UF2 UF3
#-0.03614290 -0.03986195 -0.06848576
推荐阅读
- google-apps-script - 如何锁定 Google 表格中的当前屏幕视图(使用 App 脚本或其他)?
- python - 将文件名作为 python 函数传入
- php - 在自定义网站上显示 Zabbix 图表
- c++ - 在素数c ++程序中不断出现浮点异常
- c# - 部署 UWP 应用程序时 SQL 错误 25 但调试时没有?
- c# - btnClicked 中使用的单选按钮
- google-sheets - 根据范围的第一个日期设置范围内的日期
- php - 如何使用 pdo 更新 php 中的字符串值
- swift - 如何在 Swift 中隐藏一个方法(所以它仍然可用)?
- python-2.7 - 如何从另一个 gui 填充 tkinter 中的输入框