基于条件的数据帧中的替换值

时间:2017-04-04 15:46:45

标签: r dplyr

我有以下数据集

library(dplyr)


df<- data.frame(c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b"),
                c(1,    1,   2,   2,   2,   3,   1,   2,   2,   2,   3,   3),
                c(25,   75,  20,  40,  60,  50,  20,  10,  20,  30,  40,  60))
colnames(df)<-c("name", "year", "val")

我们通过dfnameyear进行分组来总结,然后找到这些条目的平均值和数量

asd <- (df %>%
         group_by(name,year) %>%
         summarize(average = mean(val), `ave_number` = n()))

这提供了以下所需的输出

    name  year average ave_number
  <fctr> <dbl>   <dbl>      <int>
1      a     1      50          2
2      a     2      40          3
3      a     3      50          1
4      b     1      20          1
5      b     2      20          3
6      b     3      50          2

现在,asd$average的所有条目asd$ave_number<2我希望根据以下基于year

的数组替换replacer<- data.frame(c(1,2,3), c(100,200,300)) colnames(replacer)<-c("year", "average")
    name  year average ave_number
  <fctr> <dbl>   <dbl>      <int>
1      a     1      50          2
2      a     2      40          3
3      a     3      300         1 #substituted
4      b     1      100         1 #substituted 
5      b     2      20          3
6      b     3      50          2

换句话说,我想以

结束
dplyr

有没有办法通过%>%实现这一目标?我想我必须使用asd %>% group_by(name, year) %>% summarize(average = ifelse(n() < 2, #SOMETHING#, mean(val))) - 运算符,就像这样( not working code

{{1}}

2 个答案:

答案 0 :(得分:1)

这就是我要做的事情:

colnames(replacer) <- c("year", "average_replacer") #To avoid duplicate of variable name
asd <- left_join(asd, replacer, by = "year") %>% 
mutate(average = ifelse(ave_number < 2, average_replacer, average)) %>%
select(-average_replacer)

  name  year average ave_number
<fctr> <dbl>   <dbl>      <int>
1      a     1      50          2
2      a     2      40          3
3      a     3     300          1
4      b     1     100          1
5      b     2      20          3
6      b     3      50          2

关于以下内容:

  

我想我必须使用%&gt;% - 运算符

您不必使用管道操作员。它是为了方便,因为你可以一个接一个地串起(或“管道”)函数,就像你想到的那样。这有点像在你的代码中有一个流程。

答案 1 :(得分:1)

您可以通过使用年份而不是数据框的替换值的命名向量来轻松完成此操作。如果您设置了数据框,则表示您正在使用连接。

replacer <- setNames(c(100,200,300),c(1,2,3))

asd <- df %>%
          group_by(name,year) %>%
          summarize(average = mean(val), 
                    ave_number = n()) %>% 
  mutate(average = if_else(ave_number < 2, replacer[year], average))


Source: local data frame [6 x 4]
Groups: name [2]

    name  year average ave_number
  <fctr> <dbl>   <dbl>      <int>
1      a     1      50          2
2      a     2      40          3
3      a     3     300          1
4      b     1     100          1
5      b     2      20          3
6      b     3      50          2