首页 > 解决方案 > 在字符串中排序名称并汇总订单号

问题描述

我正在处理两个小问题。结果应该是第三个小标题。第一个小标题(顺序)定义了名称的顺序。此顺序应应用于第二个小标题 (df)。

order <- tibble(order = c(1, 2, 3, 4, 5, 6),
                names = c("Christine", "Bernward", "Daniel", "Atze", "Franz", "Emil"))
print(order)
# A tibble: 6 x 2
  order names    
  <dbl> <chr>    
1     1 Christine
2     2 Bernward 
3     3 Daniel   
4     4 Atze     
5     5 Franz    
6     6 Emil

df <- tibble(names_combined = c("Atze, Christine", "Bernward, Christine",
                                "Emil, Daniel", "Atze, Franz", "Franz, Bernward, Christine"))
print(df)
# A tibble: 5 x 1
  names_combined     
  <chr>              
1 Atze, Christine    
2 Bernward, Christine
3 Emil, Daniel       
4 Atze, Franz        
5 Franz, Bernward, Christine

如您所见,df 中的第一个值是“Atze, Christine”,但它应该是“Christine, Atze”,因为 Christine 排在第一位,而 Atze 排在第四位。这应该适用于 tibble df 中的所有值。重要的是,保持结构。所以它应该是“name1,name2”,用逗号和空格分隔它们。

作为第二列,应将每个组合的订单数相加。所以 Christine 作为 1 和 Atze 作为 4 应该是 5 等等。

结果应如下所示:

result <- tibble(names_combined = c("Christine, Atze", "Christine, Bernward",
                                    "Daniel, Emil", "Atze, Franz", "Christine, Bernward, Franz"),
                 order_combined = c(5, 3, 9, 9, 8))
print(result)
# A tibble: 5 x 2
  names_combined             order_combined
  <chr>                               <dbl>
1 Christine, Atze                         5
2 Christine, Bernward                     3
3 Daniel, Emil                            9
4 Atze, Franz                             9
5 Christine, Bernward, Franz              8

我正在考虑一种方法,例如将 df 中的 names_combined 拆分为其元素,然后将它们与订单重新组合,但这似乎太难了。也许有一个更直接的解决方案。

标签: r

解决方案


使用输入数据“df”,使用 ) 创建一个序列列,使用(from )row_number()拆分“names_combined”,使用“order”数据集、带有“rn”的行和“order”列,然后按以下方式分组'rn', 'names_combined' with while 获取or 'order' 列separate_rowstidyrleft_joinarrangepastetoStringsumsummarise

library(dplyr)
library(tidyr)
df %>% 
  mutate(rn = row_number()) %>% 
  separate_rows(names_combined) %>%
  left_join(order, by = c("names_combined" = "names")) %>% 
   arrange(rn, order) %>%
   group_by(rn) %>%
   summarise(names_combined = toString(names_combined), 
         order_combined = sum(order), .groups = 'drop') %>%
   select(-rn)

-输出

# A tibble: 5 x 2
#  names_combined             order_combined
#  <chr>                               <dbl>
#1 Christine, Atze                         5
#2 Christine, Bernward                     3
#3 Daniel, Emil                            9
#4 Atze, Franz                             9
#5 Christine, Bernward, Franz              8

推荐阅读