2015-05-06 4 views
1

Я пробовал себя в написании пакета для R, я собирался сделать это в Excel, но я решил, что научиться делать базовый пакет будет интересным и хорошим знанием.R Как установить кадр данных для функции?

Я получил функцию, но каждая переменная должна быть указана как столбец, который формирует данные отдельно, например. DATA $ D1 и т. Д. Я хотел бы знать, как сделать его более чистым, чтобы функция имела данные, имеет свой собственный аргумент, таким образом, имя набора данных нужно указывать только один раз. Точно так же скажем, пакет aov {stats} работает, где перечислены столбцы и установлен фрейм данных. А примера (Вал, Расположение являются столбцы набора данных скворцов):

aov(Val~Location, data=starlings) 

Моей Функция:

#' Run PCQ Density Calculation 
#' Take four distance measurements and specified area and estimate density. 
#' @param A = Specified Area (i.e. 1m^2 or 1 hectare (10,000 m^2)) 
#' @param D1 = Quarter 1 Distance 
#' @param D2 = Quarter 2 Distance 
#' @param D3 = Quarter 3 Distance 
#' @param D4 = Quarter 4 Distance 
#' @return The density esitmation 
#' @export 
PCQ <- function(A,D1,D2,D3,D4){ 
    return(A^2/((D1+D2+D3+D4)/4)^2) 
} 

Моей функцией используется (D1, D2, D3, D4 являются столбцами набора данных Дат):

PCQ(1,dat$D1,dat$D2,dat$D3,dat$D4) 

Я попытался с функцией имеет переменный «D», что будет держать наборы данных имени, то есть в размере $ D1 и т.д. в функции, но это не сработало.

PCQ <- function(D,A,D1,D2,D3,D4){ 
     return(A^2/((D$D1+D$D2+D$D3+D$D4)/4)^2) 
    } 

Извините за отсутствие ясности при первом редактировании.

ответ

0

Постарайся это

PCQ <- function(data,A,D1,D2,D3,D4){ 
    return(A^2/((data[,D1] + data[,D2] + data[,D3] + data[,D4])/4)^2) 
    } 

Эта функция может быть использована в качестве

PCQ(data = dat,1,"P.1st","P.2nd","P.3rd","P.4th") 
+0

Да, это работает спасибо! Хотя было бы неплохо, если бы не было необходимости использовать «» для каждого столбца Есть ли список этих операторов? и как их можно использовать таким образом, мне не удалось найти один – RyanMe321

+0

Что вы имеете в виду, есть ли список этих операторов? я не могу понять – Koundy

+0

Я использую R для базовой статистики в университете, но они на самом деле не очень многому научились, что означают, кроме того, чтобы давать код для запуска и быть в состоянии отработать его оттуда. Что такое $ [], и. в R, где я могу найти руководство по этим вещам, поскольку я понятия не имею, что они называются, поэтому я назвал их операторами. – RyanMe321

1

Или попробуйте это

dat <- data.frame(P.1st = 1:10) 
PCQ <- function(df, var1) { 
    col <- deparse(substitute(var1))  
    return(cumsum(df[, col])) 
} 
PCQ(dat, P.1st) 
# [1] 1 3 6 10 15 21 28 36 45 55 
+0

Я отредактировал свой вопрос, потому что я не очень хорошо его объяснил в первый раз. – RyanMe321

+0

Вы должны уметь адаптировать свой код с помощью упрощенного примера. Могут также быть многочисленные альтернативы. Вы можете, например, использовать в точках 'PCQ <- function (df, ...) {cols <- sapply (substitute (list (...)) [- 1], deparse)}' и ссылаться на первый аргумент внутри функции, используя 'df [, cols [1] 'и т. д. – lukeA

0

Чтобы передать несколько имен столбцов в функции, не цитируя их, мы можем использовать преимущества упаковки lazyeval

dat <- as.data.frame(matrix(1:50, ncol = 10, dimnames = list(NULL, paste0("C", 1:10)))) 
# C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 
# 1 1 6 11 16 21 26 31 36 41 46 
# 2 2 7 12 17 22 27 32 37 42 47 
# 3 3 8 13 18 23 28 33 38 43 48 
# 4 4 9 14 19 24 29 34 39 44 49 
# 5 5 10 15 20 25 30 35 40 45 50 
PCQ <- function(D, A, ...) 
{ 
    require("lazyeval") 
    cols <- lazy_dots(...) 
    cols_names <- unlist(lapply(cols, function(x) as.character(x$expr))) 

    return(A^2/(rowSums(D[,cols_names])/4)^2) 
} 

PCQ(dat, 100, C1, C5, C7, C10) 
# [1] 16.32486 15.08153 13.97502 12.98596 12.09830 

Но более красивое решение может быть создано с помощью функции select от dplyr.

PCQ2 <- function(D, A, ...) 
{ 
    require("dplyr") 

    return(A^2/(rowSums(select(D, ...))/4)^2) 
} 

PCQ2(dat, 100, C1, C5, C7, C10) 
# [1] 16.32486 15.08153 13.97502 12.98596 12.09830 
Смежные вопросы