将列中的名称更改为每组最常见的名称
Changing the Names in a Column to the most frequent Names per Group
我正在寻找一种方法来计算每个组中出现次数最多的姓名,然后将此组中的所有姓名更改为出现次数最多的姓名,或者使用出现次数最多的姓名创建一个新列。在数据集中,频繁的名字可能有联系,所以在这些情况下,我希望它选择其中一个联系在一起的名字。例如:
示例数据如下所示:
first_name = c("John", "John", "John Smith", "Linda Dawn", "Linda Dawn", "Linda", "Linda", "Linda Dawn", "Jack", "Jack", "Jack B", "Jack B")
id = c(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3)
dt = data.table(cbind(first_name, id))
first_name id
1: John 1
2: John 1
3: John Smith 1
4: Linda Dawn 2
5: Linda Dawn 2
6: Linda 2
7: Linda 2
8: Linda Dawn 2
9: Jack 3
10: Jack 3
11: Jack B 3
12: Jack B 3
我数据集中的名字也可能包含中间名。
我试过使用 DescTools::Mode()
函数,如果最常用的名字没有联系,这个函数会很好用。使用此方法,我得到以下输出:
dt[, first_name_new := Mode(first_name), by = id]
first_name id first_name_new
1: John 1 John
2: John 1 John
3: John Smith 1 John
4: Linda Dawn 2 Linda Dawn
5: Linda Dawn 2 Linda Dawn
6: Linda 2 Linda Dawn
7: Linda 2 Linda Dawn
8: Linda Dawn 2 Linda Dawn
9: Jack 3 <NA>
10: Jack 3 <NA>
11: Jack B 3 <NA>
12: Jack B 3 <NA>
有谁知道如何让 <NA>
声明 Jack 或 Jack B,或其他技术来执行此任务?
提前致谢!
Mode()
returns 2 值时有平局。只需从 Mode()
:
中取出第一个
dt[, first_name_new := Mode(first_name)[1], by = id]
> dt
first_name id first_name_new
1: John 1 John
2: John 1 John
3: John Smith 1 John
4: Linda Dawn 2 Linda Dawn
5: Linda Dawn 2 Linda Dawn
6: Linda 2 Linda Dawn
7: Linda 2 Linda Dawn
8: Linda Dawn 2 Linda Dawn
9: Jack 3 Jack
10: Jack 3 Jack
11: Jack B 3 Jack
12: Jack B 3 Jack
我正在寻找一种方法来计算每个组中出现次数最多的姓名,然后将此组中的所有姓名更改为出现次数最多的姓名,或者使用出现次数最多的姓名创建一个新列。在数据集中,频繁的名字可能有联系,所以在这些情况下,我希望它选择其中一个联系在一起的名字。例如:
示例数据如下所示:
first_name = c("John", "John", "John Smith", "Linda Dawn", "Linda Dawn", "Linda", "Linda", "Linda Dawn", "Jack", "Jack", "Jack B", "Jack B")
id = c(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3)
dt = data.table(cbind(first_name, id))
first_name id
1: John 1
2: John 1
3: John Smith 1
4: Linda Dawn 2
5: Linda Dawn 2
6: Linda 2
7: Linda 2
8: Linda Dawn 2
9: Jack 3
10: Jack 3
11: Jack B 3
12: Jack B 3
我数据集中的名字也可能包含中间名。
我试过使用 DescTools::Mode()
函数,如果最常用的名字没有联系,这个函数会很好用。使用此方法,我得到以下输出:
dt[, first_name_new := Mode(first_name), by = id]
first_name id first_name_new
1: John 1 John
2: John 1 John
3: John Smith 1 John
4: Linda Dawn 2 Linda Dawn
5: Linda Dawn 2 Linda Dawn
6: Linda 2 Linda Dawn
7: Linda 2 Linda Dawn
8: Linda Dawn 2 Linda Dawn
9: Jack 3 <NA>
10: Jack 3 <NA>
11: Jack B 3 <NA>
12: Jack B 3 <NA>
有谁知道如何让 <NA>
声明 Jack 或 Jack B,或其他技术来执行此任务?
提前致谢!
Mode()
returns 2 值时有平局。只需从 Mode()
:
dt[, first_name_new := Mode(first_name)[1], by = id]
> dt
first_name id first_name_new
1: John 1 John
2: John 1 John
3: John Smith 1 John
4: Linda Dawn 2 Linda Dawn
5: Linda Dawn 2 Linda Dawn
6: Linda 2 Linda Dawn
7: Linda 2 Linda Dawn
8: Linda Dawn 2 Linda Dawn
9: Jack 3 Jack
10: Jack 3 Jack
11: Jack B 3 Jack
12: Jack B 3 Jack