2017-02-04 69 views
0

我需要您的幫助來重新調整R中的百分比值,表示相同處理的值與最大值的百分比。重新調整R中的百分比值

例如,我有這個輸入

Value Level Treatment 
     5  1  A 
     7  2  A 
     10 4  A 
     14 1  B 
     20 2  B 
     18 4  B 
     30 1  C 
     30 2  C 
     28 4  C 

我需要這個輸出

 Value Level Treatment 
     50  1  A 
     70  2  A 
     100 4  A 
     70  1  B 
     100 2  B 
     90  4  B 
     100 1  C 
     100 2  C 
     93.3 4  C 

我想我可以用

df <- read.table(header = TRUE, text = ' 
Value Level Treatment 
     50  1  A 
     70  2  A 
     100 4  A 
     70  1  B 
     100 2  B 
     90  4  B 
     100 1  C 
     100 2  C 
     93.3 4  C 
') 

    tapply(df$Value, df$Treatment, max) 

啓動,但,那時,我也沒辦法如何進行。

有人會好心幫助我嗎? 我希望這對其他人也有用。

非常感謝。

+0

我我不確定我會跟着。以「A」處理:最大值爲4,那爲什麼第一行'50'而不是'25'(1/4 * 100)的百分比? – Phil

+1

因爲5是10的50%(處理A的最大值,它是10而不是4) –

+0

請通過我提供的**一行解決方案**。 –

回答

1

謝謝澄清。在這種情況下,易於使用dplyr

使用下面的數據:

value <- c(5, 7, 10, 14, 20, 18, 30, 30, 28) 
level <- c(1, 2, 4) 
treatment <- c("A", "A", "A", "B", "B", "B", "C", "C", "C") 

df <- data.frame(
    value, 
    level, 
    treatment, 
    stringsAsFactors = FALSE 
) 

負載tidyverse/dplyr

治療組並依次用計算基於每個
library("tidyverse") 

組:

df <- df %>% 
    group_by(treatment) %>% 
    mutate(value = value/max(value) * 100) 

df 
## Source: local data frame [9 x 3] 
## Groups: treatment [3] 
## 
##  value level treatment 
##  <dbl> <dbl>  <chr> 
## 1 50.00000  1   A 
## 2 70.00000  2   A 
## 3 100.00000  4   A 
## 4 70.00000  1   B 
## 5 100.00000  2   B 
## 6 90.00000  4   B 
## 7 100.00000  1   C 
## 8 100.00000  2   C 
## 9 93.33333  4   C 

你可以根據你的需要進行格式化。

+0

這個作品非常好,非常感謝你。 –

0

請參閱以下兩個一行變體

您還可以使用plyr包,如下圖所示:

ddply(df,~Treatment,summarise,Value=Value/max(Value)*100,Level=Level) 
      Treatment  Value Level 
    1   A  50.00000  1 
    2   A  70.00000  2 
    3   A  100.0000  4 
    4   B  70.00000  1 
    5   B  100.0000  2 
    6   B  90.00000  4 
    7   C  100.0000  1 
    8   C  100.0000  2 
    9   C  93.33333  4 

以下是使用data.table包中的其他變種:

> dt <- data.table(df) 
> dt[,list(Value=Value/max(Value)*100,Level=Level),by=Treatment] 
      Treatment  Value Level 
    1   A  50.00000  1 
    2   A  70.00000  2 
    3   A  100.0000  4 
    4   B  70.00000  1 
    5   B  100.0000  2 
    6   B  90.00000  4 
    7   C  100.0000  1 
    8   C  100.0000  2 
    9   C  93.33333  4 
0

我們可以使用avebase R

df1$Value <- with(df1, round(100*Value/ave(Value, Treatment, FUN = max))) 
df1$Value 
#[1] 50 70 100 70 100 90 100 100 93