我正在寻找一种方法来计算每个组中最频繁的名称,然后将该组中的所有名称更改为最频繁名称,或者使用最频繁名称创建一个新列。在数据集中,频繁名称中可能存在关联,因此在这些情况下,我希望它选择其中一个关联名称。例如:
样本数据如下:
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()
在平局时返回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