Функция R с аргументом как часть новой переменной - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу создать функцию для суммирования двух столбцов, в которой одно слово соединяет два столбца и есть три набора.Я хочу передать это слово в качестве единственного аргумента и добавить новый столбец с тем же именем.Что-то вроде этого1007 * аргумент не распознан, а использование что-то вроде paste() означает, что аргумент заключен в скобки и также не распознан.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я бы не советовал использовать (1) <<- и (2) deparse(substitute(...)).Что касается (1), это совет, взятый из В чем разница между assign () и << - в R? </a> относительно того, что не для использования <<- для (добавление в скобкахэто мое):

Зло и неправда [of <<-] предназначены для изменения переменных в глобальной среде.

Вот вариант tidyverse, использующийнекоторый rlang синтаксис:

library(tidyverse)
my_sum <- function(df, x) {
    x <- enquo(x)
    col <- names(df)[str_detect(names(df), quo_name(x))]
    df %>% mutate(!!x := !!sym(col[1]) + !!sym(col[2]))
}
df %>% my_sum(x)
#  the_first_x the_second_x the_first_y the_second_y  x
#1           0           10           0            5 10
#2           0            0           5            5  0
#3          10           10           5            0 20
#4           0            0           5            0  0

df %>% my_sum(y)
#  the_first_x the_second_x the_first_y the_second_y  y
#1           0           10           0            5  5
#2           0            0           5            5 10
#3          10           10           5            0  5
#4           0            0           5            0  5

Мы можем красиво объединить несколько my_sum вызовов:

df %>% my_sum(x) %>% my_sum(y)
#  the_first_x the_second_x the_first_y the_second_y  x  y
#1           0           10           0            5 10  5
#2           0            0           5            5  0 10
#3          10           10           5            0 20  5
#4           0            0           5            0  0  5
0 голосов
/ 14 сентября 2018

Вот лучший подход.(по возможности следует избегать использования <<-)

summing <- function(data, letter, pattern = paste0(letter,"$")){
    data[[letter]] <- rowSums(data[,grepl(pattern,names(data),)], na.rm = T)
    return(data)
}

Эта функция особенно удобна при работе с трубой:

library(magrittr)
df %>% summing("x") %>% summing("y")

#  the_first_x the_second_x the_first_y the_second_y  x  y
#1           0           10           0            5 10  5
#2           0            0           5            5  0 10
#3          10           10           5            0 20  5
#4           0            0           5            0  0  5

Конечно, вы можете использовать еебез канала:

ans <- summing(df, "x")
summing(ans, "y")

Аргумент pattern принимает регулярное выражение .При этом он очень общий и конкретный, к каким столбцам вы хотите добавить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...