【问题标题】:In dplyr mutate, how to reference multiple similarly named variables在 dplyr mutate 中,如何引用多个类似命名的变量
【发布时间】:2017-01-26 07:41:50
【问题描述】:

我有一个类似于这个的data.frame

library(tidyverse)
df <- data.frame(
  var_1_a = 1:100,
  var_1_b = 101:200,
  var_two_a = 5:104, 
  var_two_b = 1:100
)
head(df)
  var_1_a var_1_b var_two_a var_two_b
1       1     101         5         1
2       2     102         6         2
3       3     103         7         3
4       4     104         8         4
5       5     105         9         5
6       6     106        10         6    

我想取同名变量的差异。因为这里只有两个,所以很容易做到:

df %>%
  mutate(var_1_new = var_1_a - var_1_b,
         var_two_new = var_two_a - var_two_b)

但在实际数据中,我有大约一百个。有什么比把它们都打出来更简单的方法呢?

PS - 如果它更容易,我有一个包含所有变量的列表(例如mylist &lt;- list("var_1", "var_two")

【问题讨论】:

  • 使用mutate_而不是mutate,您可以在那里将表达式作为字符串提供,并使用您想要的数据名称执行所有gsubpaste
  • 对,但在这种情况下,我会有字符串向量,对吧?我不认为mutate_ 可以处理这个问题,还是我错了?
  • 你是对的,这适用于多个参数,不适用于字符串向量。你可以建立一个列名和表达式的列表来评估和使用do.call,但这可能不是最简单的方法。

标签: r dplyr tidyverse


【解决方案1】:

您可以使用以下代码。假设是,总是只有两个名称相似的变量。

mylist <- list("var_1", "var_two")
get_similar_names <- function(x) grep(x,names(df))
get_diff <- function(x) Reduce(`-`, subset(df,select=x) )

matches <- lapply(mylist, get_similar_names )
out <- lapply(matches, get_diff)
names(out) <- paste0(mylist,"_new")
out.df <- data.frame(out)

head(out.df)
  var_1_new var_two_new
1      -100           4
2      -100           4
3      -100           4
4      -100           4
5      -100           4
6      -100           4

【讨论】:

    【解决方案2】:

    一种通过基础 R 实现的方法,

    ind <- unique(stringr::word(names(df), 2, sep = '_'))
    m1 <- sapply(ind, function(i) Reduce(`-`, (df[stringr::word(names(df), 2, sep = '_') %in% i])))
    
    #which gives,
    head(m1)
    #     [,1] [,2]
    #[1,] -100    4
    #[2,] -100    4
    #[3,] -100    4
    #[4,] -100    4
    #[5,] -100    4
    #[6,] -100    4
    

    然后,将其带到您想要的输出,

    final_df <- cbind(df, setNames(data.frame(m1), c(paste0('var_', ind, '_new'))))
    
    #  var_1_a var_1_b var_two_a var_two_b var_1_new var_two_new
    #1       1     101         5         1      -100           4
    #2       2     102         6         2      -100           4
    #3       3     103         7         3      -100           4
    #4       4     104         8         4      -100           4
    #5       5     105         9         5      -100           4
    #6       6     106        10         6      -100           4
    

    【讨论】:

    • 感谢您的回复。这在我的特定情况下不起作用,因为变量最后并不总是数字。我将编辑原始问题以使其更清楚。
    • 是的,为了让它适合我的确切数据,我做了一些争论。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多