2011-11-19 61 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