分组后只对一列进行排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分组后只对一列进行排序相关的知识,希望对你有一定的参考价值。

如何使用dplyr将一个列中的单个条目组合在一起?我希望我可以通过电子邮件分组,然后对每个单独的列A-Z进行排序,但我无法弄清楚如何在不对整个数据帧进行排序的情况下执行此操作。非常感谢你提前!

样本数据

df <- data.frame(
  cleanname = c("Steven Smith", "Rob Tan", 'Zachary', "Matthew"),
  dirtyname = c('rob Tan', 'stevesmith','zach', "Matthew"),
  email = c('hello@email.com', 'hello@email.com', 'email2@email.com', 'email2@email.com')
)

期望的最终结果

desireddf <- data.frame(
  cleanname = c("Rob Tan", "Steven Smith", "Zachary", "Matthew"),
  dirtyname = c('rob Tan', 'stevesmith','zach', 'Matthew'),
  email = c('hello@email.com', 'hello@email.com', 'email2@email.com', 'email2@email.com')
)

编辑

感谢Sotos指出我的问题可以通过模糊名称匹配来解决。

答案

你可以使用amatch-package中的stringdist函数:

library(stringdist)
df %>% 
  mutate(dirtyname = dirtyname[amatch(tolower(cleanname), tolower(dirtyname), maxDist = 3)],
         email = email[amatch(tolower(cleanname), tolower(dirtyname), maxDist = 3)])

这使:

     cleanname  dirtyname            email
1 Steven Smith stevesmith  hello@email.com
2      Rob Tan    rob Tan  hello@email.com
3      Zachary       zach email2@email.com
4      Matthew    Matthew email2@email.com

data.table相同的逻辑:

library(data.table)
setDT(df)[, `:=` (dirtyname = dirtyname[amatch(tolower(cleanname), tolower(dirtyname), maxDist = 3)],
                  email = email[amatch(tolower(cleanname), tolower(dirtyname), maxDist = 3)])]
另一答案

如果数据框中的行表示不同的观察值,则不适合对每个列进行独立排序,因为独立的向量排序将使行不再代表单独的观察。

矢量可以通过多种方式进行排序,例如使用order()函数。

dirtyname <- dirtyname[order(dirtyname)]

以上是关于分组后只对一列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hive SQL 中对一列中的数据进行分组并将其分布在另一列中?

Mysql,如何使用另一列的最大值对一组行进行分组?

pandas 按另一列的平均值对一列的值进行排序

Sql 查询仅对一列上的数据进行排序,但不更改其他列

如何按一列分组并对另一列的值进行排序?

sql语句 按一列分组 然后再按别一列组内排序?