基于更高的行对新行进行变异。尝试使用dplyr::mutate之类的东西,但要跨行使用

基于更高的行对新行进行变异。尝试使用dplyr::mutate之类的东西,但要跨行使用,r,R,我有一个小数据框: ga_sessions_combined <- structure(list(Metric = c("Users", "Bounces", "Transactions", "Revenue"), ym_201904 = c(5813, 2124, 193, 24923.155206), ym_201905 = c(7094, 2445, 257, 40361.46), ym_201906 = c(5647, 2049, 181, 26314.32 ), ym_201

我有一个小数据框:

ga_sessions_combined <- structure(list(Metric = c("Users", "Bounces", "Transactions", 
"Revenue"), ym_201904 = c(5813, 2124, 193, 24923.155206), ym_201905 = c(7094, 
2445, 257, 40361.46), ym_201906 = c(5647, 2049, 181, 26314.32
), ym_201907 = c(5553, 1864, 144, 23678.14), ym_201908 = c(5392, 
1811, 116, 16893.6), ym_201909 = c(5160, 1933, 121, 23635.754179
), ym_201910 = c(7504, 2381, 187, 34052.48), ym_201911 = c(23808, 
4661, 1421, 285310.131623), ym_201912 = c(33244, 8332, 3259, 
596214.021099), ym_202001 = c(8460, 2987, 233, 38663.293857), 
    ym_202002 = c(7463, 1510, 212, 37170.53), ym_202003 = c(9069, 
    2103, 295, 47716.45)), .Names = c("Metric", "ym_201904", 
"ym_201905", "ym_201906", "ym_201907", "ym_201908", "ym_201909", 
"ym_201910", "ym_201911", "ym_201912", "ym_202001", "ym_202002", 
"ym_202003"), row.names = c(NA, -4L), class = c("tbl_df", "tbl", 
"data.frame"))
看起来像这样:

ga_sessions_combined
# A tibble: 4 x 13
  Metric ym_201904 ym_201905 ym_201906 ym_201907 ym_201908 ym_201909 ym_201910 ym_201911 ym_201912 ym_202001 ym_202002
  <chr>      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
1 Users      5813      7094      5647      5553      5392      5160      7504     23808     33244      8460      7463 
2 Bounc…     2124      2445      2049      1864      1811      1933      2381      4661      8332      2987      1510 
3 Trans…      193       257       181       144       116       121       187      1421      3259       233       212 
4 Reven…    24923.    40361.    26314.    23678.    16894.    23636.    34052.   285310.   596214.    38663.    37171.
我想添加一个新行“ConversionRate”,其中列度量值为“ConversionRate”,值为Transactions rows 3/Users row 1


几乎类似于dplyr,但会跨行而不是跨列进行变异。如何做到这一点?

这里有一个选项,我们过滤“指标”为“交易”或“用户”的行,然后使用Summary_all分割行,并在将“指标”创建为“转换率”后将其与原始数据集绑定

library(dplyr)
ga_sessions_combined %>% 
    filter(Metric %in% c("Transactions", "Users")) %>%
    select(-1) %>%
    summarise_all(~ last(.)/first(.)) %>% 
    bind_cols(Metric = 'ConversionRate', .) %>% 
    bind_rows(ga_sessions_combined, .)
或者另一个选项是从TIBLE添加_行,创建一个新行,将“Metric”作为“ConversionRate”,并通过分割特定行来替换最后一行数字列中的NA

library(tibble)
ga_sessions_combined %>% 
    add_row(Metric = 'ConversionRate') %>%
    mutate_if(is.numeric, 
       ~ replace(., n(), .[Metric == 'Transactions']/.[Metric == 'Users']))

这里有一个选项,我们过滤“度量”为“事务”或“用户”的行,然后使用summary_all分割行,并在将“度量”创建为“转换率”后将其与原始数据集绑定

library(dplyr)
ga_sessions_combined %>% 
    filter(Metric %in% c("Transactions", "Users")) %>%
    select(-1) %>%
    summarise_all(~ last(.)/first(.)) %>% 
    bind_cols(Metric = 'ConversionRate', .) %>% 
    bind_rows(ga_sessions_combined, .)
或者另一个选项是从TIBLE添加_行,创建一个新行,将“Metric”作为“ConversionRate”,并通过分割特定行来替换最后一行数字列中的NA

library(tibble)
ga_sessions_combined %>% 
    add_row(Metric = 'ConversionRate') %>%
    mutate_if(is.numeric, 
       ~ replace(., n(), .[Metric == 'Transactions']/.[Metric == 'Users']))
在base R中,我们可以使用rbind/cbind,如:

在base R中,我们可以使用rbind/cbind,如:


嗨,谢谢。这就得到了我需要的结果。阅读帮助的最后和第一,但我不明白。。。在通俗英语中,last and first在本文中是否指第一行上的最后一行?@DougFir在筛选步骤之后,只剩下两行。但“事务”行是最后一行或第二行。行与原始顺序中的“用户”进行比较。所以,我用了第一个和最后一个。相反,你也可以做1和2。作为索引或甚至不进行筛选,请在摘要中进行此操作。使用==~.[Metric=='Transactions']/[Metric=='Users'],在这里更容易。为了理解,谢谢。这就得到了我需要的结果。阅读帮助的最后和第一,但我不明白。。。在通俗英语中,last and first在本文中是否指第一行上的最后一行?@DougFir在筛选步骤之后,只剩下两行。但“事务”行是最后一行或第二行。行与原始顺序中的“用户”进行比较。所以,我用了第一个和最后一个。相反,你也可以做1和2。作为索引或甚至不进行筛选,请在摘要中进行此操作。使用==~.[Metric=='Transactions']/[Metric=='Users'],在这里更容易。了解