我有以下数据框,
df1
:
ID Group Time1 Time2 Time3
A00194 1 0.733 0.777 0.433
A00195 1 0.903 0.116 0.308
A00198 1 0.422 0.863 0.220
A00199 1 0.485 0.846 0.203
A02111 2 0.682 0.522 0.700
A02114 2 0.699 0.208 0.686
A02116 2 0.911 0.802 0.041
A02197 2 0.083 0.082 0.900
我想得到
ID
和Group
在每个Time1:Time3
中的最高值。
期望的输出会喜欢:
ID Group Value Test
A02116 2 0.911 Time1
A00198 1 0.863 Time2
A02197 2 0.900 Time3
我尝试了以下代码,但这需要我执行三次才能获得所需的输出。
df1[which.max(df1$Time1),,c(1:4)]
我如何在 R 中实现这一点?谢谢。
长格式数据需要找到每个
Time
.的最大值
你可以用
dplyr
和 tidyr
.
library(dplyr)
library(tidyr)
df |>
pivot_longer(contains("Time"),names_to = "Test") |>
filter(value == max(value),.by=Test) |>
arrange(Test)
输出
ID Group Test value
<chr> <dbl> <chr> <dbl>
1 A02116 2 Time1 0.911
2 A00198 1 Time2 0.863
3 A02197 2 Time3 0.9
或使用
data.table
.
df_melt = melt(df,
id.vars = c("ID","Group"),
variable.name = "Test")
df_melt[df_melt[,.I[which.max(value)],by=Test]$V1]
输出
ID Group Test value
1: A02116 2 Time1 0.911
2: A00198 1 Time2 0.863
3: A02197 2 Time3 0.900
library(tidyverse)
df1 %>%
pivot_longer(cols = starts_with("Time"), names_to = "Test", values_to = "Value") %>%
group_by(Test) %>%
slice_max(Value, n = 1) %>%
select(ID, Group, Value, Test)
ID Group Value Test
1 A02116 2 0.911 Time1
2 A00198 1 0.863 Time2
3 A02197 2 0.9 Time3
library(dplyr)
library(tidyr)
df1 %>%
mutate(across(Time1:Time3, ~if_else(.x == max(.x), .x, NA))) %>%
pivot_longer(-c(ID, Group), values_drop_na = TRUE, names_to = "Test")
#> # A tibble: 3 x 4
#> ID Group Test value
#> <chr> <int> <chr> <dbl>
#> 1 A00198 1 Time2 0.863
#> 2 A02116 2 Time1 0.911
#> 3 A02197 2 Time3 0.9
read.table(text= " ID Group Time1 Time2 Time3
A00194 1 0.733 0.777 0.433
A00195 1 0.903 0.116 0.308
A00198 1 0.422 0.863 0.220
A00199 1 0.485 0.846 0.203
A02111 2 0.682 0.522 0.700
A02114 2 0.699 0.208 0.686
A02116 2 0.911 0.802 0.041
A02197 2 0.083 0.082 0.900", header = T, stringsAsFactor = F) -> df1