重新调整R中的百分比值

时间:2017-02-04 11:27:03

标签: 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)

但是,我不知道如何继续。

有人会这么善意帮助我吗? 我希望这对其他人也有用。

非常感谢。

3 个答案:

答案 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

您可以根据需要进行格式化。

答案 1 :(得分:0)

请参阅以下两个一行变体

您还可以使用-O2包,如下所示:

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

答案 2 :(得分:0)

我们可以使用ave

中的base 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