我有一個看起來像這樣的資料框。
| 用戶 | V1 | V2 | V3 |
|---|---|---|---|
| 吉姆 | .34 | .33 | .88 |
| 大衛 | .54 | .34 | .71 |
| 斯科特 | .12 | .25 | .12 |
| 坦率 | .76 | .76 | .44 |
| 道格 | .68 | .09 | .54 |
| 湯姆 | .91 | .67 | .92 |
但我想計算一個新變數。我希望通過從列的平均值中減去相應變數 ( , , ) 中的每個觀察值來計算新變數 ( V1_DISTfromMEAN, V2_DISTfromMEAN, )。例如,該列的平均值為0.55。所以對于吉姆來說,我希望等式是 0.34 - .55 = -0.21。為. 生成的資料框類似于下面的資料框,所有值都已填寫。V3_DISTfromMEANV1V2V3V1V1_DISTfromMean
| 用戶 | V1 | V2 | V3 | V1_DISTfromMEAN | V2_DISTfromMEAN | V1_DISTfromMEAN |
|---|---|---|---|---|---|---|
| 吉姆 | .34 | .33 | .88 | - .21 | ??? | ??? |
| 大衛 | .54 | .34 | .71 | - .01 | ??? | ??? |
| 斯科特 | .12 | .25 | .12 | ??? | ??? | ??? |
| 坦率 | .76 | .76 | .44 | ??? | ??? | ??? |
| 道格 | .68 | .09 | .54 | ??? | ??? | ??? |
| 湯姆 | .91 | .67 | .92 | ??? | ??? | ??? |
任何幫助將不勝感激。如果我未能包含所有必要的資料,請告訴我。
uj5u.com熱心網友回復:
用于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 包創建于 2022-03-02 (v2.0.1)
uj5u.com熱心網友回復:
我們可以使用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
uj5u.com熱心網友回復:
一個可能的解決方案,基于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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/437212.html
