使用功能和“ $”从数据框中选择列

时间:2018-10-22 12:22:26

标签: r dataframe

我想通过一个函数从R数据框中选择一列,例如:

my_new_df <- function(input_1, input_2) {
df <- input_1
col <- noquote(input_2)
df_new <- df$col
return(df_new)
 }

my_new_df(mtcars, "mpg")
-> NULL

您能否解释一下为什么$不能在函数中使用? 谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用[[运算符根据名称选择一列。

my_new_df <- function(input_1, input_2) {
df <- input_1

df_new <- df[[input_2]]
return(df_new)
}

编辑:df[["input_2"]]等效于df$input_2,都返回一个向量, 不是data.frame。如果需要返回data.frame,请参阅gpier的其他答案。

答案 1 :(得分:1)

您可以这样做:

my_new_df <- function(input_1, input_2) {
  col <- which(colnames(input_1)%in%input_2)
  df_new <- input_1[,col]
  return(df_new)
}
my_new_df(data.frame(mtcars), "mpg")
[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4
[17] 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4

编辑:如果您想保留data.frame格式,则可以使用drop=FALSE

my_new_df <- function(input_1, input_2) {
  col <- which(colnames(input_1)%in%input_2)
  df_new <- input_1[,col, drop=FALSE]
  return(df_new)
}
my_new_df(data.frame(mtcars), "mpg")
                     mpg
Mazda RX4           21.0
Mazda RX4 Wag       21.0
Datsun 710          22.8
Hornet 4 Drive      21.4
Hornet Sportabout   18.7
Valiant             18.1
Duster 360          14.3
Merc 240D           24.4
Merc 230            22.8
Merc 280            19.2
Merc 280C           17.8
Merc 450SE          16.4
Merc 450SL          17.3
Merc 450SLC         15.2
Cadillac Fleetwood  10.4
Lincoln Continental 10.4
Chrysler Imperial   14.7
Fiat 128            32.4
Honda Civic         30.4
Toyota Corolla      33.9
Toyota Corona       21.5
Dodge Challenger    15.5
AMC Javelin         15.2
Camaro Z28          13.3
Pontiac Firebird    19.2
Fiat X1-9           27.3
Porsche 914-2       26.0
Lotus Europa        30.4
Ford Pantera L      15.8
Ferrari Dino        19.7
Maserati Bora       15.0
Volvo 142E          21.4

这同样适用于多个列名。

my_new_df <- function(input_1, input_2) {
  col <- which(colnames(input_1)%in%input_2)
  df_new <- input_1[,col, drop=FALSE]
  return(df_new)
}
my_new_df(data.frame(mtcars), c("mpg", "cyl"))
                     mpg cyl
Mazda RX4           21.0   6
Mazda RX4 Wag       21.0   6
Datsun 710          22.8   4
Hornet 4 Drive      21.4   6
Hornet Sportabout   18.7   8
Valiant             18.1   6
Duster 360          14.3   8
Merc 240D           24.4   4
Merc 230            22.8   4
Merc 280            19.2   6
Merc 280C           17.8   6
Merc 450SE          16.4   8
Merc 450SL          17.3   8
Merc 450SLC         15.2   8
Cadillac Fleetwood  10.4   8
Lincoln Continental 10.4   8
Chrysler Imperial   14.7   8
Fiat 128            32.4   4
Honda Civic         30.4   4
Toyota Corolla      33.9   4
Toyota Corona       21.5   4
Dodge Challenger    15.5   8
AMC Javelin         15.2   8
Camaro Z28          13.3   8
Pontiac Firebird    19.2   8
Fiat X1-9           27.3   4
Porsche 914-2       26.0   4
Lotus Europa        30.4   4
Ford Pantera L      15.8   8
Ferrari Dino        19.7   6
Maserati Bora       15.0   8
Volvo 142E          21.4   4

答案 2 :(得分:1)

对不起,我的评论太草率了,让我们将它们放在一起:

(1)如果要以一列作为向量作为回报,请使用Soeren D.的解决方案

(2)如果您想要一个通用的解决方案,让您选择获取向量,或者选择返回一列或多列的data.frame,请使用gpier解决方案

(3)如果要一列作为 data.frame 作为回报,请使用

my_new_df <- function(input_1, input_2) 
{
    df <- input_1
    df_new <- df[ input_2 ]
    return(df_new)
}

仅当您想在屏幕上显示结果时,才需要行return(df_new)。如果您的目标只是将其分配给另一个变量,则可以忽略它。