2013-02-08 3 views
2

Я пытаюсь создать функцию, которая принимает два аргумента. Один аргумент - это имя фрейма данных, а второе - имя столбца в этом фрейме данных. Цель состоит в том, чтобы функция манипулировала данными во всем кадре на основе информации, содержащейся в указанном столбце.кадр данных в пользовательской функции в R

Моя проблема заключается в том, что я не могу понять, как использовать символьное выражение, введенное во второй аргумент, для доступа к этому конкретному столбцу в кадре данных внутри функции. Вот супер краткий пример,

datFunc <- function(dataFrame = NULL, charExpres = NULL) { 

return(dataFrame$charExpress) 

} 

Если, например, вы вводите

datFunc(myData, "variable1") 

это не возвращает MyData $ Variable1. там должен быть простой способ сделать это. Извините, если вопрос глуп, но я бы очень хотел помочь здесь.

Связанный вопрос будет, как использовать строку символов «myData $ variable1» для фактического возврата переменной1 из myData?

+1

'return (dataFrame [[charExpress]])'? – adibender

ответ

2

Я думаю ОП также хочет передать имя dataframe как строку. Если это так, ваша функция должна быть чем-то вроде. (заимствованный образец из другого ответа)

fooFunc <- function(dfNameStr, colNamestr, drop=TRUE) { 
    df <- get(dfNameStr) 
    return(df[,colNamestr, drop=drop]) 
} 


> myData <- data.frame(ID=1:10, variable1=rnorm(10, 10, 1)) 
> myData 
    ID variable1 
1 1 10.838590 
2 2 9.596791 
3 3 10.158037 
4 4 9.816136 
5 5 10.388900 
6 6 10.873294 
7 7 9.178112 
8 8 10.828505 
9 9 9.113271 
10 10 10.345151 


> fooFunc('myData', 'ID', drop=F) 
    ID 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 
10 10 
> fooFunc('myData', 'ID', drop=T) 
[1] 1 2 3 4 5 6 7 8 9 10 
+0

+1 для 'get', не знал об этом! Использовали' grep' 'colnames' в течение самого длительного времени получить индекс! – JackeJR

1

Вы почти там, попробуйте использовать [ вместо $ для такого рода индексации

datFunc <- function(dataFrame = NULL, charExpres = NULL, drop=TRUE) { 
    return(dataFrame[, charExpres, drop=drop]) 
    } 


# An example 
set.seed(1) 
myData <- data.frame(ID=1:10, variable1=rnorm(10, 10, 1)) # DataFrame 

datFunc(myData, "variable1") # dropping dimensions 
[1] 9.373546 10.183643 9.164371 11.595281 10.329508 9.179532 10.487429 10.738325 10.575781 9.694612 

datFunc(myData, "variable1", drop=FALSE) # keeping dimensions 
    variable1 
1 9.373546 
2 10.183643 
3 9.164371 
4 11.595281 
5 10.329508 
6 9.179532 
7 10.487429 
8 10.738325 
9 10.575781 
10 9.694612 
+0

одинаково отлично, спасибо! –

+0

Могу ли я задать еще один быстрый вопрос? предположим, что я хочу разрешить пользователю называть столбец фрейма данных, который будет создан функцией, передавая символьную строку в функцию в качестве аргумента. Как вы можете это сделать? –

+0

Я не могу повышать, так как у меня нет достаточно высокой репутации ... :( –

0

В качестве альтернативы, вы можете найти индекс столбца в dataframe:

df <- as.data.frame(matrix(rnorm(100), ncol = 10)) 
colnames(df) <- sample(LETTERS, 10) 

column.index.of.A <- grep("^A$", colnames(df)) 
df[, column.index.of.A] 
Смежные вопросы