如何索引R中函数内的dataframe列

时间:2018-04-09 04:25:44

标签: r dataframe indexing dplyr mutate

我有一个函数,它接受一个数据帧,百分位数阈值和给定列的名称,并计算给定列中高于此阈值的所有值作为新列(0表示&lt ;,和1 for> =)。但是,它不允许我在df$column_name函数中执行quantile,因为column_name实际上不是列名,而是存储实际列名的变量。因此df$column_name将返回NULL。有没有办法解决这个问题,并保持代码格式与目前的相似?或者我是否必须指定实际的数字列值而不是名称?虽然我可以这样做,但它绝对不像传递列名那样方便/易于理解。

func1 <- function(df, threshold, column_name) {
  threshold_value <- quantile(df$column_name, c(threshold)) 
  new_df <- df %>%
    mutate(ifelse(column_name > threshold_value, 1, 0)) 
  return(new_df)
}

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:4)

我修改了你的功能如下。现在,该函数可以采用数据框,阈值和列名称。此功能仅需要基础R。

# Modified function
func1 <- function(df, threshold, column_name) {
  threshold_value <- quantile(df[[column_name]], threshold) 
  new_df <- df
  new_df[["new_col"]] <- ifelse(df[[column_name]] > threshold_value, 1, 0) 
  return(new_df)
}

# Take the trees data frame as an example
head(trees)
#   Girth Height Volume
# 1   8.3     70   10.3
# 2   8.6     65   10.3
# 3   8.8     63   10.2
# 4  10.5     72   16.4
# 5  10.7     81   18.8
# 6  10.8     83   19.7

# Apply the function
func1(trees, 0.5, "Volume")
#    Girth Height Volume new_col
# 1    8.3     70   10.3       0
# 2    8.6     65   10.3       0
# 3    8.8     63   10.2       0
# 4   10.5     72   16.4       0
# 5   10.7     81   18.8       0
# 6   10.8     83   19.7       0
# 7   11.0     66   15.6       0
# 8   11.0     75   18.2       0
# 9   11.1     80   22.6       0
# 10  11.2     75   19.9       0
# 11  11.3     79   24.2       0
# 12  11.4     76   21.0       0
# 13  11.4     76   21.4       0
# 14  11.7     69   21.3       0
# 15  12.0     75   19.1       0
# 16  12.9     74   22.2       0
# 17  12.9     85   33.8       1
# 18  13.3     86   27.4       1
# 19  13.7     71   25.7       1
# 20  13.8     64   24.9       1
# 21  14.0     78   34.5       1
# 22  14.2     80   31.7       1
# 23  14.5     74   36.3       1
# 24  16.0     72   38.3       1
# 25  16.3     77   42.6       1
# 26  17.3     81   55.4       1
# 27  17.5     82   55.7       1
# 28  17.9     80   58.3       1
# 29  18.0     80   51.5       1
# 30  18.0     80   51.0       1
# 31  20.6     87   77.0       1

如果您仍想使用,了解如何处理非标准评估至关重要。请参阅此内容以了解详情(https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html)。以下代码也适用。

library(dplyr)

func2 <- function(df, threshold, column_name) {
  col_en <- enquo(column_name)
  threshold_value <- quantile(df %>% pull(!!col_en), threshold)
  new_df <- df %>%
    mutate(new_col := ifelse(!!col_en >= threshold_value, 1, 0))
  return(new_df)
}

func2(trees, 0.5, Volume)
#    Girth Height Volume new_col
# 1    8.3     70   10.3       0
# 2    8.6     65   10.3       0
# 3    8.8     63   10.2       0
# 4   10.5     72   16.4       0
# 5   10.7     81   18.8       0
# 6   10.8     83   19.7       0
# 7   11.0     66   15.6       0
# 8   11.0     75   18.2       0
# 9   11.1     80   22.6       0
# 10  11.2     75   19.9       0
# 11  11.3     79   24.2       1
# 12  11.4     76   21.0       0
# 13  11.4     76   21.4       0
# 14  11.7     69   21.3       0
# 15  12.0     75   19.1       0
# 16  12.9     74   22.2       0
# 17  12.9     85   33.8       1
# 18  13.3     86   27.4       1
# 19  13.7     71   25.7       1
# 20  13.8     64   24.9       1
# 21  14.0     78   34.5       1
# 22  14.2     80   31.7       1
# 23  14.5     74   36.3       1
# 24  16.0     72   38.3       1
# 25  16.3     77   42.6       1
# 26  17.3     81   55.4       1
# 27  17.5     82   55.7       1
# 28  17.9     80   58.3       1
# 29  18.0     80   51.5       1
# 30  18.0     80   51.0       1
# 31  20.6     87   77.0       1