首页 > 解决方案 > 在 R 中的特定行上发生变异

问题描述

我想对特定行进行变异,同时评估多行的变异,这些行将保持在简单filter(). 我能怎么做?

df <-
  data.frame(ID = c(1,1,1,2,2,2,3,3,3),
             Date= c(1,2,3,1,2,3,1,2,3),
             Money = c(500,400,500,5000,100,100,200,300,300), 
             Status = c("Good", "Bad", "Good", "Good","Good","Good", "Bad","Good","Good"))

例如,我想mutate(Money = max(Money))Date==1但同时我不想删除其他变量或在所有分组日期执行突变。有什么办法吗?结果应如下表所示。

result <- 
  data.frame(ID = c(1,1,1,2,2,2,3,3,3), 
                     Date= c(1,2,3,1,2,3,1,2,3),
                     Money = c(5000,400,500,5000,100,100,5000,300,300),
                     Status = c("Good", "Bad", "Good", "Good","Good","Good", "Bad","Good","Good"),
                     Status_overall = c("Bad", "Bad", "Bad", "Good","Good","Good", "Bad","Bad","Bad"))

标签: rfilterdplyr

解决方案


也许试试这个。您可以将最大值存储在新变量中,然后使用条件按组进行变异。我不知道结果中的最后一个变量来自哪里:

library(dplyr)
#Code
new <- df %>% mutate(Val=max(Money)) %>%
  group_by(ID) %>% mutate(Money=ifelse(Date==1,Val,Money)) %>%
  select(-Val)

输出:

# A tibble: 9 x 4
# Groups:   ID [3]
     ID  Date Money Status
  <dbl> <dbl> <dbl> <fct> 
1     1     1  5000 Good  
2     1     2   400 Bad   
3     1     3   500 Good  
4     2     1  5000 Good  
5     2     2   100 Good  
6     2     3   100 Good  
7     3     1  5000 Bad   
8     3     2   300 Good  
9     3     3   300 Good 

也许没有复杂性的简单方法可能是(@GregorThomas建议):

#Code2
new <- df %>% mutate(Money=ifelse(Date==1,max(Money),Money))

输出:

  ID Date Money Status
1  1    1  5000   Good
2  1    2   400    Bad
3  1    3   500   Good
4  2    1  5000   Good
5  2    2   100   Good
6  2    3   100   Good
7  3    1  5000    Bad
8  3    2   300   Good
9  3    3   300   Good

推荐阅读