R语言 如何根据分组值设置列的格式?

vwkv1x7d  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(140)

我有一个数据框,看起来像所附图像的顶部表。
我有一组名称,其中一个名称可以属于以下类别之一:category 1category 2special
我想输出一个数据框,其中每个名称只显示一个类别,该类别基于数字列中的最大数字。
如果存在特殊类别,则该名称应该是special类别,而不管数字值如何。
请参考所附图像的底部表格作为我正在寻找的输出的例子。
我的数据:

df <- structure(list(Name = c("Name A", "Name A", "Name B", "Name B", 
"Name C", "Name C", "Name C"), Category = c("Category 1", "Category 2", 
"Category 1", "Category 2", "Category 1", "Category 2", "Special"
), Number = c(10L, 5L, 3L, 20L, 3L, 25L, 4L)), class = "data.frame", row.names = c(NA, 
-7L))

qaxu7uf2

qaxu7uf21#

另一个维护行排序的tidyverse方法:

df %>%
  group_by(Name)%>%
  mutate(Category = ifelse("Special"%in%Category ,'Special', 
                           Category[which.max(Number)]))
# A tibble: 7 × 3
# Groups:   Name [3]
  Name   Category   Number
  <chr>  <chr>       <int>
1 Name A Category 1     10
2 Name A Category 1      5
3 Name B Category 2      3
4 Name B Category 2     20
5 Name C Special         3
6 Name C Special        25
7 Name C Special         4
s71maibg

s71maibg2#

我们可以这样做:
通过以降序形式排列(-),我们保持了在mutate中使用first()函数的行顺序:

library(dplyr)

df %>% 
  group_by(Name) %>% 
  arrange(-Number, .by_group = TRUE) %>% 
  mutate(Category = ifelse("Special" %in% Category, "Special", first(Category)))
Name   Category   Number
  <chr>  <chr>       <int>
1 Name A Category 1     10
2 Name A Category 1      5
3 Name B Category 2     20
4 Name B Category 2      3
5 Name C Special        25
6 Name C Special         4
7 Name C Special         3
df <- structure(list(Name = c("Name A", "Name A", "Name B", "Name B", 
"Name C", "Name C", "Name C"), Category = c("Category 1", "Category 2", 
"Category 1", "Category 2", "Category 1", "Category 2", "Special"
), Number = c(10L, 5L, 3L, 20L, 3L, 25L, 4L)), class = "data.frame", row.names = c(NA, 
-7L))

相关问题