我是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”替换希拉里克林顿的所有id。此操作应适用于所有其他名称(伯尼桑德斯和唐纳德特朗普)。
据我了解,它可以通过“if”和“for”完成,但我找不到明确的解决方案。
任何帮助都会感激不尽!
约瑟夫
答案 0 :(得分:0)
使用这个出色的自定义mode功能:
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
然后library(dplyr)
:
library(dplyr)
df %>% group_by(last_name) %>% mutate(id = Mode(id))
Source: local data frame [9 x 5]
Groups: last_name [3]
id first_name last_name info1 info2
<int> <chr> <chr> <int> <int>
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
答案 1 :(得分:0)
这可以通过在姓氏上使用factor
来实现:
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顺序,只需将您输入的顺序更改为factor
的levels参数。