为每列找到最大值及其组 ID

问题描述 投票:0回答:3

我有以下数据框,

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 中实现这一点?谢谢。

r dataframe subset reshape
3个回答
1
投票

长格式数据需要找到每个

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

0
投票
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

0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.