我需要你的帮助来重新调整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 :(得分: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