计算新的数据框变量与列平均值的距离

发布于 2025-01-11 08:52:26 字数 1684 浏览 0 评论 0原文

我有一个看起来像这样的数据框。

用户V1V2V3
Jim.34.33.88
David.54.34.71
Scott.12.25.12
Frank.76.76.44
Doug.68.09.54
Tom.91.67.92

但我想要来计算一个新的变量。我希望通过从相应变量 (V1< /code>、V2V3)来自列的平均值。例如,V1 列的平均值为 0.55。所以对于 Jim,我希望方程为 0.34 - 0.55 = -0.21。对于V1_DISTfromMean。生成的数据框将类似于下面的数据框,其中填充了所有值。

UserV1V2V3V1_DISTfromMEANV2_DISTfromMEANV1_DISTfromMEAN
Jim.34.33.88- .21??????
大卫.54.34.71- .01??????
斯科特.12.25.12?????????
弗兰克.76.76.44?????????
道格.68.09.54?????????
汤姆.91.67.92?????????

任何帮助将不胜感激。如果我未能包含所有必要的数据,请告诉我。

I have a dataframe that look something like this.

UserV1V2V3
Jim.34.33.88
David.54.34.71
Scott.12.25.12
Frank.76.76.44
Doug.68.09.54
Tom.91.67.92

But I would like to calculate a new variables. I want the new variables (V1_DISTfromMEAN, V2_DISTfromMEAN, V3_DISTfromMEAN) to be calculated by subtracting each observation from their corresponding variables (V1, V2, V3) from the column's mean value. For example, the mean for the column V1 is .55. So for Jim, I would want the equation to be .34 - .55 = -0.21. for V1_DISTfromMean. The resulting dataframe would look something like the one below, with all values filled in.

UserV1V2V3V1_DISTfromMEANV2_DISTfromMEANV1_DISTfromMEAN
Jim.34.33.88- .21??????
David.54.34.71- .01??????
Scott.12.25.12?????????
Frank.76.76.44?????????
Doug.68.09.54?????????
Tom.91.67.92?????????

Any help would be greatly appreciated.Let me know if I've failed to include all the necessary data.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

忆悲凉 2025-01-18 08:52:26

使用 colMeans 获取均值向量,从输入数据集中减去,注意 R 的表操作按列主顺序排列,将原始数据与结果绑定。

df1 <- read.table(text = "
User    V1  V2  V3
Jim     .34     .33     .88
David   .54     .34     .71
Scott   .12     .25     .12
Frank   .76     .76     .44
Doug    .68     .09     .54
Tom     .91     .67     .92
", header = TRUE)

mu <- colMeans(df1[-1])
tmp <- t(t(df1[-1]) - mu)
colnames(tmp) <- paste(colnames(tmp), "DISTfromMEAN", sep = "_")
df2 <- cbind(df1, tmp)
rm(tmp)

df2
#>    User   V1   V2   V3 V1_DISTfromMEAN V2_DISTfromMEAN V3_DISTfromMEAN
#> 1   Jim 0.34 0.33 0.88     -0.21833333     -0.07666667      0.27833333
#> 2 David 0.54 0.34 0.71     -0.01833333     -0.06666667      0.10833333
#> 3 Scott 0.12 0.25 0.12     -0.43833333     -0.15666667     -0.48166667
#> 4 Frank 0.76 0.76 0.44      0.20166667      0.35333333     -0.16166667
#> 5  Doug 0.68 0.09 0.54      0.12166667     -0.31666667     -0.06166667
#> 6   Tom 0.91 0.67 0.92      0.35166667      0.26333333      0.31833333

reprex 软件包 (v2.0.1) 创建于 2022 年 3 月 2 日

Use colMeans to get a vector of means, subtract from the input data set taking care that R's table operations are in column major order, bind the original with the result.

df1 <- read.table(text = "
User    V1  V2  V3
Jim     .34     .33     .88
David   .54     .34     .71
Scott   .12     .25     .12
Frank   .76     .76     .44
Doug    .68     .09     .54
Tom     .91     .67     .92
", header = TRUE)

mu <- colMeans(df1[-1])
tmp <- t(t(df1[-1]) - mu)
colnames(tmp) <- paste(colnames(tmp), "DISTfromMEAN", sep = "_")
df2 <- cbind(df1, tmp)
rm(tmp)

df2
#>    User   V1   V2   V3 V1_DISTfromMEAN V2_DISTfromMEAN V3_DISTfromMEAN
#> 1   Jim 0.34 0.33 0.88     -0.21833333     -0.07666667      0.27833333
#> 2 David 0.54 0.34 0.71     -0.01833333     -0.06666667      0.10833333
#> 3 Scott 0.12 0.25 0.12     -0.43833333     -0.15666667     -0.48166667
#> 4 Frank 0.76 0.76 0.44      0.20166667      0.35333333     -0.16166667
#> 5  Doug 0.68 0.09 0.54      0.12166667     -0.31666667     -0.06166667
#> 6   Tom 0.91 0.67 0.92      0.35166667      0.26333333      0.31833333

Created on 2022-03-02 by the reprex package (v2.0.1)

甜柠檬 2025-01-18 08:52:26

我们可以使用cross

library(dplyr)

df %>% 
  mutate(across(-User, ~. -mean(.), .names = "{.col}_DISTfromMEAN"))
   User   V1   V2   V3 V1_DISTfromMEAN V2_DISTfromMEAN V3_DISTfromMEAN
1   Jim 0.34 0.33 0.88     -0.21833333     -0.07666667      0.27833333
2 David 0.54 0.34 0.71     -0.01833333     -0.06666667      0.10833333
3 Scott 0.12 0.25 0.12     -0.43833333     -0.15666667     -0.48166667
4 Frank 0.76 0.76 0.44      0.20166667      0.35333333     -0.16166667
5  Doug 0.68 0.09 0.54      0.12166667     -0.31666667     -0.06166667
6   Tom 0.91 0.67 0.92      0.35166667      0.26333333      0.31833333

We could use across:

library(dplyr)

df %>% 
  mutate(across(-User, ~. -mean(.), .names = "{.col}_DISTfromMEAN"))
   User   V1   V2   V3 V1_DISTfromMEAN V2_DISTfromMEAN V3_DISTfromMEAN
1   Jim 0.34 0.33 0.88     -0.21833333     -0.07666667      0.27833333
2 David 0.54 0.34 0.71     -0.01833333     -0.06666667      0.10833333
3 Scott 0.12 0.25 0.12     -0.43833333     -0.15666667     -0.48166667
4 Frank 0.76 0.76 0.44      0.20166667      0.35333333     -0.16166667
5  Doug 0.68 0.09 0.54      0.12166667     -0.31666667     -0.06166667
6   Tom 0.91 0.67 0.92      0.35166667      0.26333333      0.31833333
回心转意 2025-01-18 08:52:26

一个可能的解决方案,基于dplyr

library(dplyr)

df <- data.frame(
  stringsAsFactors = FALSE,
  User = c("Jim", "David", "Scott", "Frank", "Doug", "Tom"),
  V1 = c(0.34, 0.54, 0.12, 0.76, 0.68, 0.91),
  V2 = c(0.33, 0.34, 0.25, 0.76, 0.09, 0.67),
  V3 = c(0.88, 0.71, 0.12, 0.44, 0.54, 0.92)
)

df %>% 
  mutate(across(-1, ~ .x - mean(.x), .names = "{.col}_DISTfromMEAN"))

#>    User   V1   V2   V3 V1_DISTfromMEAN V2_DISTfromMEAN V3_DISTfromMEAN
#> 1   Jim 0.34 0.33 0.88     -0.21833333     -0.07666667      0.27833333
#> 2 David 0.54 0.34 0.71     -0.01833333     -0.06666667      0.10833333
#> 3 Scott 0.12 0.25 0.12     -0.43833333     -0.15666667     -0.48166667
#> 4 Frank 0.76 0.76 0.44      0.20166667      0.35333333     -0.16166667
#> 5  Doug 0.68 0.09 0.54      0.12166667     -0.31666667     -0.06166667
#> 6   Tom 0.91 0.67 0.92      0.35166667      0.26333333      0.31833333

A possible solution, based on dplyr:

library(dplyr)

df <- data.frame(
  stringsAsFactors = FALSE,
  User = c("Jim", "David", "Scott", "Frank", "Doug", "Tom"),
  V1 = c(0.34, 0.54, 0.12, 0.76, 0.68, 0.91),
  V2 = c(0.33, 0.34, 0.25, 0.76, 0.09, 0.67),
  V3 = c(0.88, 0.71, 0.12, 0.44, 0.54, 0.92)
)

df %>% 
  mutate(across(-1, ~ .x - mean(.x), .names = "{.col}_DISTfromMEAN"))

#>    User   V1   V2   V3 V1_DISTfromMEAN V2_DISTfromMEAN V3_DISTfromMEAN
#> 1   Jim 0.34 0.33 0.88     -0.21833333     -0.07666667      0.27833333
#> 2 David 0.54 0.34 0.71     -0.01833333     -0.06666667      0.10833333
#> 3 Scott 0.12 0.25 0.12     -0.43833333     -0.15666667     -0.48166667
#> 4 Frank 0.76 0.76 0.44      0.20166667      0.35333333     -0.16166667
#> 5  Doug 0.68 0.09 0.54      0.12166667     -0.31666667     -0.06166667
#> 6   Tom 0.91 0.67 0.92      0.35166667      0.26333333      0.31833333
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文