迭代用数据框中最频繁出现的元素替换元素

时间:2016-11-25 16:24:47

标签: r

我是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”完成,但我找不到明确的解决方案。

任何帮助都会感激不尽!

约瑟夫

2 个答案:

答案 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参数。