2011-11-19 125 views
3

這是我的問題,當我想開發一個功能廣泛使用。函數參數定義問題在R

dataframe1 <- data.frame(V1 = 1:10, V2 = 11:20, V3 = 21:30, V4 = 31:40) 
myfun <- function (dataframe, A, B, yvar) { 
        dataframe1$A <- as.factor(dataframe$A) 
        dataframe1$B <- as.factor (dataframe$B) 
        dataframe1 <- data.frame(A = dataframe1$A, 
        B = dataframe1$B, yvar = dataframe1$yvar) 
        print(dataframe1) 
        } 

myfun (dataframe = dataframe1, A = "V1", B= "V2", yvar = "V3") 
Error in `$<-.data.frame`(`*tmp*`, "A", value = integer(0)) : 
    replacement has 0 rows, data has 10 

myfun (dataframe = dataframe1, A = dataframe1$V1, 
     B= dataframe1$V2, yvar = dataframe1$V3) 
Error in `$<-.data.frame`(`*tmp*`, "A", value = integer(0)) : 
    replacement has 0 rows, data has 10 

我想使用的第一種類型定義,在變量名的說法是「括號」,而不是「數據文件$ VARIABLENAME」

+0

好像這個問題已經 – hadley

+0

以前有人問我找到確切的問題,我可以看到一個類似但不同的問題 - http://stackoverflow.com/questions/8121542/r-specifying-variable-name-in-function-parameter-for-a-function-of-general-uni,我希望這不是投票的原因!如果有人可以指示我相同的問題,我會很高興,即使關閉此帖... – jon

回答

6

您只需不使用$作爲列的定義選擇。相反,使用[

dataframe[,A] 

dataframe[,B] 

等。你的情況:

dataframe1 <- data.frame(V1 = 1:10, V2 = 11:20, V3 = 21:30, V4 = 31:40) 
myfun <- function (dataframe, A, B, yvar) { 
        dataframe1[,A] <- as.factor(dataframe[,A]) 
        dataframe1[,B] <- as.factor (dataframe[,B]) 
        dataframe1 <- data.frame(A = dataframe1[,A], 
        B = dataframe1[,B], yvar = dataframe1[,yvar]) 
        print(dataframe1) 
        } 

myfun (dataframe = dataframe1, A = "V1", B= "V2", yvar = "V3") 

    A B yvar 
1 1 11 21 
2 2 12 22 
3 3 13 23 
4 4 14 24 
5 5 15 25 
6 6 16 26 
7 7 17 27 
8 8 18 28 
9 9 19 29 
10 10 20 30 
+0

感謝您的甜蜜答案,我想知道「$」和[,C1]列選擇器的區別? – jon

+0

dataframe $ A搜索名爲「A」的列。如果A包含一個字符串,那麼dataframe [,A]將搜索一個名稱不管A包含的列。 – Dason

+0

'The R Inferno'的圈子8.1.39可能會有所幫助。 http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –

3

直接回答你的問題是使用[索引,而不是$索引,因爲$索引不允許間接的子集。

此外,還可以大幅使用單個data.frame語句來提高你的函數的可讀性沒有定義任何的中間變量:

myfun <- function (dataframe, A, B, yvar) { 
    data.frame(
     A = as.factor(dataframe[, A]), 
     B = as.factor(dataframe[, B]), 
     yvar = dataframe[, yvar] 
) 
} 

myfun(dataframe1, "V1", "V2", "V3") 
    A B yvar 
1 1 11 21 
2 2 12 22 
3 3 13 23 
4 4 14 24 
5 5 15 25 
6 6 16 26 
7 7 17 27 
8 8 18 28 
9 9 19 29 
10 10 20 30