Как вставить подмножество столбцов, используя dplyr - PullRequest
0 голосов
/ 28 августа 2018

Как мне вставить динамическое подмножество столбцов из data.frame, используя dplyr?

Если у меня есть следующая функция:

d = data.frame(a = 1:5, b=2:6, c=3:7)

fun = function(d, colnames){

    d$f = Reduce(function(x,y)paste(x,y,sep='_'), d[,colnames])

    return(d)
}

fun(d, c('a','b'))

fun(d, c('b','c'))

fun(d, c('a','b','c'))

Как мне переписать функцию с помощью dplyr?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вот версия вашей функции с использованием dplyr и rlang

library(dplyr)
library(rlang)

fun = function(d,a,b){
  a.var <- enquo(a)
  b.var <- enquo(b)
  d %>% mutate(f = paste(!!a.var,!!b.var, sep="_"))
}

fun(d,a,b)

Обновление

fun = function(d,...){
  #browser()
  vars  <- quos(...)
  d %>% mutate(f = paste(!!!vars, sep="_"))
}

fun(d,a)
fun(d,c,a)
fun(d,a,b,c)
0 голосов
/ 28 августа 2018

Это работает для вашего примера:

> library(dplyr)    
> d = data.frame(a = 1:5, b=2:6, c=3:7)
> d <- d %>% mutate(f = paste(a,b,sep='_'))
> d
  a b c   f
1 1 2 3 1_2
2 2 3 4 2_3
3 3 4 5 3_4
4 4 5 6 4_5
5 5 6 7 5_6

EDIT:

После редактирования это будет работать для вас:

> library(dplyr)
> d = data.frame(a = 1:5, b=2:6, c=3:7)
> colnames <- c("a", "c")
> d <- d %>% mutate(f = paste(!!as.name(colnames[1]),!!as.name(colnames[2]),sep='_'))     
> d
  a b c   f
1 1 2 3 1_3
2 2 3 4 2_4
3 3 4 5 3_5
4 4 5 6 4_6
5 5 6 7 5_7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...