R: Отправка только столбца фрейма данных (не фрейма данных) в пользовательскую функцию - PullRequest
1 голос
/ 15 декабря 2011

Я знаю, что очень похожие вопросы задавались ранее, но я до сих пор не получил ответа на свой точный вопрос из этих старых постов. Моя функция 'test' должна выполнять только для столбца 'col' фрейма данных (на самом деле данные из файла .csv) 'x', т.е.

test <- function(x$col){...}
:
test(x$col)

Я знаю, что этот синтаксис не работает. Так что мне нужно сделать:

test <- function(x,col){...}
:
test(x$col)

Но проблема с вышесказанным заключается в том, что, поскольку функции R по своей природе передаются по значению, весь фрейм данных 'x' передается в функцию 'test', что является высокоэффективным способом, особенно с LARGE 'x'. !

Обходной путь:

test <- function(y){...}
:
y <- x$col
test(y)

Но это не хорошо. Я добавляю лишнюю строку кода / вектора для странного явления, для которого я не вижу очевидной причины! Кроме того, это усложняет читабельность кода, поскольку везде в коде, который я использую x$col для этого столбца.

Есть ли способ отправить только копию столбца (x$col), используя некоторую комбинацию 'x' и 'col' (и без дополнительной переменной!) В качестве аргумента моей функции 'test' ??

Или кто-то может предложить причину неспособности отправить только столбец в качестве аргумента функции 'test'? Кроме того, является ли вообще неэффективным использование x$col каждый раз, поскольку он может не находиться в памяти все время?

Ответы [ 3 ]

4 голосов
/ 15 декабря 2011

Разве это не работает?

spam <- function(col) {
   return(col*10)
}

dat <- data.frame(bla = 1:10, xi = 1:10)

spam(dat$bla)

Я не думаю, что bla полностью передается функции. Глядя на:

> str(dat$bla)
 int [1:10] 1 2 3 4 5 6 7 8 9 10

Я подозреваю, что при настройке создается новый объект, и передаются только значения в dat$bla. Или я тут совершенно не прав?

2 голосов
/ 15 декабря 2011

Это будет зависеть от того, как вы вызовете тест, но любой из них может быть ответом:

test <- function(x,col){  x[[col]] } # for x being data.frame or list

test <- function(x,col){ x[ , col] } # for x being data.frame or matrix

Вам следует избегать использования оператора "$" при передаче аргументов функциям, поскольку он не преобразует значение "col" во что-то другое. Он пытается вернуть столбец с именем «col», и это, как правило, НЕ то, что вам нужно, когда вы передаете аргумент функции. С другой стороны, функции "[" и "[[") оценят col и выполнят извлечение со значением, которое вы передали.

Если вы хотите работать только с одним столбцом, это также возможно:

test <- with(x, function(col) {col} )  
# obviously you could do more with col inside the braces

Функция with устанавливает среду, в которой "col" будет интерпретироваться как действительное имя объекта.

1 голос
/ 15 декабря 2011

Я не уверен, но вы этого хотите?

#Your Data Frame
x<-data.frame(matrix(rnorm(25),ncol=5))
x

#A Function to text Something, you choose the data and the columm
test.function<- function(data.frame,columm) {
                                            data.frame[,columm]>0
                                            }
#Work either with the number of the columm                                            
test.function(x,1)
#or de "name" of the columm
test.function(x,"X1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...