迭代替换数据框中出现频率最高的元素
迭代替换数据框中出现频率最高的元素
我是R编程的初学者,尝试用它来处理我的数据。
我想通过用数据框中最常出现的元素替换一些元素来创建新的数据框。
我的原始数据框如下:
df: id | first_name | last_name | info_1 |infor_2 ---|------------|-----------|--------|------- 1 | Hillary | Clinton | 2 | 3 1 | Hillary | Clinton | 10 | 2 2 | Donald | Trump | 5 | 6 2 | Donald | Trump | 3 | 8 4 | Hillary | Clinton | 9 | 5 3 | Bernie | Sanders | 5 | 0 3 | Donald | Trump | 4 | 9 3 | Bernie | Sanders | 24 | 9 6 | Bernie | Sanders | 24 | 9
新的数据框应该是这样的:
new_df: id | first_name | last_name | info_1 |infor_2 ---|------------|-----------|--------|------- 1 | Hillary | Clinton | 2 | 3 1 | Hillary | Clinton | 10 | 2 2 | Donald | Trump | 5 | 6 2 | Donald | Trump | 3 | 8 1 | Hillary | Clinton | 9 | 5 3 | Bernie | Sanders | 5 | 0 2 | Donald | Trump | 4 | 9 3 | Bernie | Sanders | 24 | 9 3 | Bernie | Sanders | 24 | 9
如你所见,在第一个数据框中,"1"是Hillary Clionton最常出现的id,但第5行出现了"4"。所以,我想用"1"替换Hillary Clinton的所有id。这个操作应该适用于其他所有姓名(Bernie Sanders和Donald Trump)。
据我理解,可以通过"if"和"for"来完成,但我找不到明确的解决方案。
非常感谢任何帮助!
Joseph
在给定的数据框中,需要用最频繁出现的元素替换元素。问题的出现是因为数据框中的某些元素需要替换为最频繁出现的元素。解决方法是使用factor
函数和levels
函数来实现。
首先,可以使用factor
函数将最后一个名字转换为因子类型,并为每个名字分配一个唯一的ID。代码如下所示:
df$id <- as.integer(factor(df$last_name, levels=c("Clinton", "Trump", "Sanders"))) df id first_name last_name info1 info2 1 1 Hillary Clinton 2 3 2 1 Hillary Clinton 10 2 3 2 Donald Trump 5 6 4 2 Donald Trump 3 7 5 1 Hillary Clinton 4 11 6 3 Bernie Sanders 3 2 7 2 Donald Trump 5 6 8 3 Bernie Sanders 24 8 9 3 Bernie Sanders 12 11
要更改ID的顺序,只需改变传递给levels
参数的顺序即可。
如果数据的规模非常大,包含了几乎1000个不同的姓氏,可以使用levels(df$last_names)
来获取姓氏的唯一列表。然后可以根据字母表的顺序对其进行排序,或者根据频率使用table
函数对其进行排序。
问题的原因是需要在数据框中将元素替换为出现频率最高的元素。解决方法是使用自定义的"mode"函数,并使用dplyr库中的"group_by"和"mutate"函数进行操作。
首先,我们定义一个名为"Mode"的函数,该函数可以找到一个向量中出现频率最高的元素。函数的实现如下:
Mode <- function(x) { ux <- unique(x) ux[which.max(tabulate(match(x, ux)))] }
然后,我们加载"dplyr"库,并使用"group_by"和"mutate"函数将数据按"last_name"分组,并在每个组中将"id"替换为该组中出现频率最高的"id"。代码如下:
library(dplyr) df %>% group_by(last_name) %>% mutate(id = Mode(id))
运行以上代码后,将得到一个新的数据框,其中每个组的"id"都被替换为该组中出现频率最高的"id"。结果如下:
Source: local data frame [9 x 5] Groups: last_name [3] id first_name last_name info1 info21 1 Hillary Clinton 2 3 2 1 Hillary Clinton 10 2 3 2 Donald Trump 5 6 4 2 Donald Trump 3 7 5 1 Hillary Clinton 4 11 6 3 Bernie Sanders 3 2 7 2 Donald Trump 5 6 8 3 Bernie Sanders 24 8 9 3 Bernie Sanders 12 11
最后,问题提出者感谢评论中的建议,并说明他的实际数据框非常大,因此有几个人共享相同的"last_name",所以他将尝试使用"first_name"和"last_name"来区分它们。同时,他再次感谢了评论的建议。