R:在自定义函数中将列名称作为变量传递

时间:2017-10-29 22:09:07

标签: r function variables dataframe

我对R和编程很新,并且几个小时以来一直在努力解决以下问题。

我正在尝试创建一个将df和列名称作为变量的函数,根据提供的列名过滤表并打印输出。

example_function <- function(df=df, col=col){
         a <- df[col == 100,]
         b <- filter(df, col == 100)
         print(a)
         print(b)
}

使用example_function(df=example_df, col='percentage')不起作用,两个变量只返回列名但没有数据行(尽管有值== 100)。

使用example_function(df=df, col=percentage),因此百分比不会被引号括起来,我得到:

  

[.data.frame中的错误(df,col == 100,):对象'百分比'没有   结果

但是,当我运行example_function(df=example_df, col=example_df$percentage)时,我得到了正确的结果,我的数据帧按预期返回,只有example_df$percentage等于100的行。

我真的希望能够将df作为一个变量传递而将列作为另一个传递而不必每次都输入example_df$percentage,因为我希望能够为许多不同的数据帧重新使用该函数并输入这似乎是多余的。

基于此,我修改了函数,认为我可以在函数中使用df$col,它将评估为example_df$percentage并像上面那样工作:

example_function <- function(df=df, col=col){
     a <- df[df$col == 100,]
     b <- filter(df, df$col == 100)
     print(a)
     print(b)
}

但现在使用example_function(df=example_df, col=percentage)或传递col='percentage'时出现了另一个错误:

  

filter_impl(.data,quo)中的错误:结果的长度必须为19,而不是0

是否有任何机构可以帮助我解决这个问题,或者指出我正确的方向来理解为什么我正在做的事情不起作用?

非常感谢

以下是我正在使用的数据框的示例(虽然我的实际数据框将有更多列但我希望它对这个示例没有任何影响。)

 name    | percentage
    -----------------------
    tom      |  80
    john     |  100
    harry    |  99
    elizabeth|  100
    james    |  50




  example_df <- structure(list(name = structure(c(5L, 4L, 2L, 1L, 3L), .Label = c("elizabeth", 
    "harry", "james", "john", "tom"), class = "factor"), percentage = c(80L, 
    100L, 99L, 100L, 50L)), .Names = c("name", "percentage"), class = "data.frame", row.names = c(NA, 
    -5L))
  • 作为注释,我已将此col = names更新为col =百分比,在此示例中更准确地表示我正在做的事情。在我试图概括这个例子的过程中,我使用了col = names,现在意识到这不是一个很好的例子(因为你非常正确地断言'名字'永远不可能是数字)。但是,上述问题仍然存在。

**更新:我设法使用以下内容:

example_function <- function(df=df, col=col){
     a <- df[df[col] == 100,]
     print(a)
}

传递example_function(df=example_df, col='percentage')

1 个答案:

答案 0 :(得分:1)

example_function的第一行应为

a <- df[df[[col]] == 100,]

当你将其分解时,df[['names']] == 100将为您提供一个逻辑列表,这些逻辑对应于df的{​​{1}}值为100的行。但names是荒谬的:它总是假的。