2016-09-23 9 views
1

関数内でデータフレームを正しく操作することができません。私は適切にインデックスを作成していないことを知っているが、私はそれを修正する方法を見つけることができません。関数内でデータフレームのインデックスを作成する問題

私は同じように、私のデータフレームに因子のレベルを変更したい:

data <- data.frame(X1=c("a","b","c")) 
levels(data$X1) <- c("x","y","z") 

しかし、私は私の機能の同じ内部を行うように見えることはできません。

> ex <- function(input,var){ 
+ levels(input$var) <- c("x","y","z") 
+ return(var) 
+ } 
> test <- ex(data,"X1") 
Error in levels(input$var) <- c("x", "y", "z") : 
attempt to set an attribute on NULL 

> ex2 <- function(input,var){ 
+ levels(input[,var]) <- c("x","y","z") 
+ return(var) 
+ } 
> test2 <- ex2(data,"X1") 
> test2 
[1] "X1" 

私はvarを出力するかどうかは実際には気にしません。データフレームとカラムを適切に参照する方法を知りたいので、関数内でそれらを操作できます。

+0

'try ex < - function(input、var){}' – lmkirvan

+0

これは何を解決しますか? – ZachTurn

+0

申し訳ありませんが、私はコメントを編集するのを待ってから変更できませんでした。私はあなたの関数から正しい項目を返さなかったことを指摘するつもりでした。 – lmkirvan

答えて

1

問題は、機能がdata$X1の代わりにdata$varを探していたことでした。また、returnがある場合は、dataに割り当てようとする場合は、列名ではなくデータフレームである必要があります。

これを簡単に解決する方法はたくさんあります。ここには1つがあります:

ex <- function(input,var){ 
    levels(input[,colnames(test) %in% var]) <- c("x","y","z") 
    return(input) 
    } 


test <- ex(data,"X1") 
test 
+2

あなたは 'levels(input [[var]])< - ' – akrun

+0

で簡略化できると思います[[var]]を使うと完璧に動作します!違いを説明してもらえますか? – ZachTurn

関連する問題