Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在dplyr mutate中,如何引用多个相似命名的变量_R_Dplyr_Tidyverse - Fatal编程技术网

在dplyr mutate中,如何引用多个相似命名的变量

在dplyr mutate中,如何引用多个相似命名的变量,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我有一个类似于此的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

我有一个类似于此的
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    
但在真实数据中,我有大约一百个这样的。做这件事比把它们都打出来更容易的方法是什么


PS-如果这更简单,我有一个包含所有变量的列表(例如,
mylist一种通过base 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

ind您可以使用下面的代码。假设始终只有两个名称相似的变量

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

mylist感谢您的回复。这在我的具体情况下不起作用,因为变量的结尾并不总是数字。我将编辑原始问题以使其更清楚。是的,为了使其适合我的确切数据,需要进行一些争论。谢谢!使用
mutate\uuuuu
而不是
mutate
,您可以在那里以字符串形式给出表达式d用你想要的数据名做所有的
gsub
paste
。对,但在这种情况下我会有字符串向量,对吗?我不认为
mutate\uu
可以处理这个问题,或者我错了吗?你是对的,这适用于多个参数,而不是字符串向量。你可以建立一个列和表达式的名称列表s评估并使用
do.call
,但这可能不是最简单的方法。
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
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