【问题标题】:apply `mutate_at` for two columns at the same time?同时对两列应用`mutate_at`?
【发布时间】:2020-05-21 12:49:30
【问题描述】:

我如何同时为两列调用像mutate_at 这样的函数

例如,如果我有一个列名一致的 df,并且我想找到不同之处,我可以这样做:

library(dplyr)

df <-
tibble(x_1 = 1:5,
       x_2 = 1:5,
       y_1 = 6:10,
       y_2 = 6:10)

df %>% 
  mutate(x_dif = x_1 - x_2,
         y_dif = y_1 - y_2)

手动执行此操作很容易,但我想以 可扩展 的方式将一个函数应用于两列。我在概念上将此视为两个mutate_at,我会在一个电话中同时执行vars(x_1, y_1)vars(x_2, y_2),但我认为这不是正确的方法。

【问题讨论】:

  • 您可能必须先转换为长格式,然后再从那里获取

标签: r dplyr


【解决方案1】:

我尝试通过dplyr 进行操作,但结果非常麻烦。然而,在基础 R 中,这是一个单线,即

Reduce(`-`, split.default(df, sub('.*_','',names(df))))

这里也是dplyr版本。

library(dplyr)
library(tidyr)

df %>% 
 pivot_longer(everything()) %>% 
 mutate(name = sub('_.*', '', name)) %>% 
 group_by(name, grp = with(rle(name), rep(seq_along(lengths), lengths))) %>% 
 summarise(new = diff(value)) %>% 
 ungroup() %>% 
 select(-grp) %>% 
 pivot_wider(names_from = name, values_from = new, values_fn = list(new = list)) %>% 
 unnest()

在这两种情况下,您都可以随意整理输出。

【讨论】:

    【解决方案2】:

    可能不是您理想的解决方案,但这是我的处理方式。

    library(purrr)
    library(dplyr)
    
    cols_nums <- unique(gsub(pattern = "[A-z]", "", names(df))) %>% 
      map(~names(df)[grepl(., names(df))])
    
    map2_df(cols_nums[2], cols_nums[1], function(x, y) {
      out <- df[,x]-df[,y]
      names(out) <- paste0(names(out), "_diff")
      out
    })
    
    # x_2_diff y_2_diff
    # 1        0        0
    # 2        0        0
    # 3        0        0
    # 4        0        0
    # 5        0        0
    

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2019-11-27
      • 1970-01-01
      • 2018-07-06
      • 2020-01-03
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多