2015-09-16 53 views
3

我有一個數據集,看起來像這樣:標準化爲100數據

Var Trait Value 
0 Trait1 42.26 
1 Trait1 41.81 
2 Trait1 41.21 
0 Trait2 47.82 
1 Trait2 51.44 
2 Trait2 51.42 
0 Trait3 10.27 
1 Trait3 10.63 
2 Trait3 10.14 

我想用這樣的計算每個性狀和VAR1標準化爲100點的數據添加第四列:

(42.26/42.26)×100 =

(41.81/42.26)×100 = 98.93

(41.21/42.26)×100 = 97.51

對於性狀2和VAR1 = 1時,值大於VAR1 = 0值。在該情況下,行5將這樣計算大,從而: (47.82/51.44) * 100 = 92.94

+3

或者只是'與(DF,AVE(值,性狀,FUN =函數(X)X/MAX(X)* 100))' –

+0

非常感謝精彩的建議! – VasoGene

回答

3

如果你的數據是data.table:

data[, col4:= (Value/max(Value))*100, by= Trait] 
+0

非常感謝您的精彩建議! – VasoGene

1

使用dplyr

library(dplyr) 

df %>% 
    group_by(Trait) %>% 
    mutate(Result = Value/max(Value) * 100) 

# Output 
# Source: local data frame [9 x 4] 
# Groups: Trait [3] 
# 
#  Var Trait Value Result 
# (int) (fctr) (dbl)  (dbl) 
# 1  0 Trait1 42.26 100.00000 
# 2  1 Trait1 41.81 98.93516 
# 3  2 Trait1 41.21 97.51538 
# 4  0 Trait2 47.82 92.96267 
# 5  1 Trait2 51.44 100.00000 
# 6  2 Trait2 51.42 99.96112 
# 7  0 Trait3 10.27 96.61336 
# 8  1 Trait3 10.63 100.00000 
# 9  2 Trait3 10.14 95.39040 
+1

Mutate是否創建一個新列? – Soheil

+0

@Sheheil是的。 – zx8754

+0

非常感謝您的精彩建議! – VasoGene

2

或用標準R:

dat$Normalized <- (dat$Value/ave(dat$Value, dat$Trait, FUN = max)) * 100 
> dat 
    Var Trait Value Normalized 
1 0 Trait1 42.26 100.00000 
2 1 Trait1 41.81 98.93516 
3 2 Trait1 41.21 97.51538 
4 0 Trait2 47.82 92.96267 
5 1 Trait2 51.44 100.00000 
6 2 Trait2 51.42 99.96112 
7 0 Trait3 10.27 96.61336 
8 1 Trait3 10.63 100.00000 
9 2 Trait3 10.14 95.39040 
+0

非常感謝您的精彩建議! – VasoGene