【问题标题】:How does use apply and mutate for create a new variable?如何使用 apply 和 mutate 创建新变量?
【发布时间】:2021-05-19 14:14:08
【问题描述】:

假设我有以下 DF

df<-data.frame(name=c(rep("AUS",5), rep("FRA",5), rep("SPA",5)),
           Date=rep(seq(as.Date("2020/1/1"), as.Date("2020/1/5"), "days"),3),
           mean= c(19, 2, 22, 13, 23, 24, 7, 14, 27, 30, 4, 26, 1, 18, 5))

我的想法是使用变量mean 创建一个新变量。首先是对 DF 进行分组,因为必须为组估计新变量。

df<-df%>%group_by(name)

我希望我的第一个观察结果与其他行一起使用,我想说我的新变量将是以下结果:

19, 19/2, 19/22, 19/13, 19/23, 24, 24/7,..... 4/5

虽然我可以将apply 命令与groupmutate 一起使用,但我在寻找解决方案时遇到了问题。

【问题讨论】:

    标签: r apply dplyr


    【解决方案1】:

    您可以使用first 获取每个组的第一个数据 (name) 并将其除以 mean 值。

    library(dplyr)
    
    df %>%
      group_by(name) %>%
      mutate(res = c(first(mean), first(mean)/mean[-1])) %>%
      ungroup
    
    #  name  Date        mean    res
    #   <chr> <date>     <dbl>  <dbl>
    # 1 AUS   2020-01-01    19 19    
    # 2 AUS   2020-01-02     2  9.5  
    # 3 AUS   2020-01-03    22  0.864
    # 4 AUS   2020-01-04    13  1.46 
    # 5 AUS   2020-01-05    23  0.826
    # 6 FRA   2020-01-01    24 24    
    # 7 FRA   2020-01-02     7  3.43 
    # 8 FRA   2020-01-03    14  1.71 
    # 9 FRA   2020-01-04    27  0.889
    #10 FRA   2020-01-05    30  0.8  
    #11 SPA   2020-01-01     4  4    
    #12 SPA   2020-01-02    26  0.154
    #13 SPA   2020-01-03     1  4    
    #14 SPA   2020-01-04    18  0.222
    #15 SPA   2020-01-05     5  0.8  
    

    这可以写在base R中-

    transform(df, res = ave(mean, name, FUN = function(x) c(x[1], x[1]/x[-1])))
    

    data.table -

    library(data.table)
    setDT(df)[, res := c(first(mean), first(mean)/mean[-1]), name]
    

    【讨论】:

    • 这与我使用的方法相同,但我仍然遇到问题。第一次观察不能是 1。我的新变量的第一次观察必须等于平均值​​的第一次观察(按组)。
    • @EveChanatasig 知道了...查看更新后的答案。
    【解决方案2】:

    这是使用ifelse 指定您的两个条件的另一个解决方案:如果mean 是组中的第一个,则使用mean;如果它不是组中的第一个,则将第一个 mean 除以 mean 值:

    df %>%
      group_by(name) %>%
      mutate(new = ifelse(mean == first(mean), mean, first(mean)/mean))
    # A tibble: 15 x 4
    # Groups:   name [3]
       name  Date        mean    new
       <chr> <date>     <dbl>  <dbl>
     1 AUS   2020-01-01    19 19    
     2 AUS   2020-01-02     2  9.5  
     3 AUS   2020-01-03    22  0.864
     4 AUS   2020-01-04    13  1.46 
     5 AUS   2020-01-05    23  0.826
     6 FRA   2020-01-01    24 24    
     7 FRA   2020-01-02     7  3.43 
     8 FRA   2020-01-03    14  1.71 
     9 FRA   2020-01-04    27  0.889
    10 FRA   2020-01-05    30  0.8  
    11 SPA   2020-01-01     4  4    
    12 SPA   2020-01-02    26  0.154
    13 SPA   2020-01-03     1  4    
    14 SPA   2020-01-04    18  0.222
    15 SPA   2020-01-05     5  0.8  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多