我想通过一个函数从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
您能否解释一下为什么$不能在函数中使用? 谢谢
答案 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)
。如果您的目标只是将其分配给另一个变量,则可以忽略它。