R语言 查找最大值和包含每行最大值的项

lnlaulya  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(219)

我有一个数据集,其中每行表示一个订单,其中包含多个项目和每个项目的订购数量。我想知 prop 有最高数量的每行的项目名称和数量。
我的数据看起来像下面:

Item1   Qty1    Item2   Qty2    Item3   Qty3    Item4   Qty4
SUV1     4       SUV2    5       SUV3    5       SUV4    3
SUV4     7       PLV4    3       PNC5    6        NA    NA
SUV3     5       PNC3    5        NA     NA       NA    NA

当我尝试下面的代码时,我能够获得每行中具有最高值的列名,但不能获得项目名称:

## 
library(tidyverse)

sodf_rank<- sodf2 %>% 
  rownames_to_column('id') %>%  # creates an ID number
  gather(dept, cnt, SKU1_Qty:SKU10_Qty) %>% 
  group_by(id) %>% 
  slice(which.max(cnt))
##

我希望得到如下结果:

RowID   Item    Qty
1       SUV2    5
2       SUV4    7
3       SUV3    5
umuewwlo

umuewwlo1#

library(tidyverse)
df1 %>% 
  rowid_to_column() %>% 
  unite(Item, Item1, Item2, Item3, Item4) %>% 
  unite(Qty, Qty1, Qty2, Qty3, Qty4) %>% 
  separate_rows(2:3, sep = "_") %>% 
  mutate(Qty = as.numeric(Qty)) %>% 
  group_by(rowid) %>% 
  filter(Qty == max(Qty, na.rm = TRUE))
#> # A tibble: 5 x 3
#> # Groups:   rowid [3]
#>   rowid Item    Qty
#>   <int> <chr> <dbl>
#> 1     1 SUV2      5
#> 2     1 SUV3      5
#> 3     2 SUV4      7
#> 4     3 SUV3      5
#> 5     3 PNC3      5

或者在最后一行中使用filter(Qty == max(Qty, na.rm = TRUE))

... %>% 
  arrange(-Qty) %>% 
  slice(1)

以获得:

# # A tibble: 3 x 3
# # Groups:   rowid [3]
#   rowid Item    Qty
#   <int> <chr> <dbl>
# 1     1 SUV2      5
# 2     2 SUV4      7
# 3     3 SUV3      5
# Warning message:
# NAs introduced by coercion

数据:

df1 <- read.table(text="Item1   Qty1    Item2   Qty2    Item3   Qty3    Item4   Qty4
                        SUV1       4    SUV2       5    SUV3       5    SUV4       3
                        SUV4       7    PLV4       3    PNC5       6    NA        NA
                        SUV3       5    PNC3       5    NA        NA    NA        NA", 
                   header=T)
kq4fsx7k

kq4fsx7k2#

在基R中,我们可以分离"Item""Qty"列,使用max.colqty_cols中获得最大值,并从item_cols中获得相应的值。

item_cols <- grep("^Item", names(df), value = TRUE)
qty_cols <- grep("^Qty", names(df), value = TRUE)

inds <- cbind(seq_len(nrow(df)), max.col(replace(df[qty_cols], 
              is.na(df[qty_cols]), 0), ties.method = "first"))

data.frame(RowID = seq_len(nrow(df)), Item = df[item_cols][inds], 
           Qty = df[qty_cols][inds])

#  RowID Item Qty
#1     1 SUV2   5
#2     2 SUV4   7
#3     3 SUV3   5

或者使用apply行方式的另一个选项

t(apply(df, 1, function(x) {
     inds <- which.max(x[qty_cols])
     c(x[qty_cols][inds], x[item_cols][inds])
}))

相关问题