误解创建 r 函数
Misunderstanding creating r function
我正在尝试使用可以正常工作的命令行创建一个函数。我正在为看起来像这样的数据集创建标识符
Nom Var1 Var2
N1 v11 v12
N2 . .
N2 . .
N3 V32 V32
我的命令是:transform(df$Nom, id=match(df$Nom, unique(df$Nom)))
并且工作正常。
但是,如果我在下面写一个像 ht 这样的函数;我收到错误:"unique applies only to vectors"
createid<-function(var){
x<- transform(var, id=match(var, unique(var)))
ids<-paste0("id_",x[,2])
return(ids)
}
df$id<-createid(df$Nom)
类似地,如果 Y 编写以下函数,我会得到错误 Error in d$var : object of type 'closure' is not subsettable
createid<-function(d,var){
x<- transform(d$var, id=match(d$var, unique(d$var)))
ids<-paste0("id_",x[,2])
return(ids)
}
df$id<-createid(d,Nom)
我认为您在 R 中编写函数的方式有一些我不理解的地方,尤其是当您在数据框中调用变量时。有人可以帮我弄这个吗?
谢谢
您可以在不使用 transform
的情况下执行此操作。正如@LyzandeR 在评论中提到的,最好使用 d[[var]]
而不是 d$var
。
createid <- function(d, var){
d$id <- match(d[[var]], unique(d[[var]]))
d }
createid(df, 'Nom')
# Nom Var1 Var2 id
#1 N1 v11 v12 1
#2 N2 . . 2
#3 N2 . . 2
#4 N3 V32 V32 3
或者如果你真的想使用$
,那么你可以使用eval(parse(
,但不推荐这条路线,也不是那么简单。
createid1 <- function(d, var){
m1 <- match.call()
e1 <- eval(parse(text=paste0(deparse(m1$d),'$',m1$var)))
d$id <- match(e1, unique(e1))
d}
createid1(df, 'Nom')
# Nom Var1 Var2 id
#1 N1 v11 v12 1
#2 N2 . . 2
#3 N2 . . 2
#4 N3 V32 V32 3
或者代替eval(parse
createid2 <- function(d, var){
args <- as.list(match.call())
e1 <- eval(args$var, d)
d$id <- match(e1, unique(e1))
d
}
createid2(df, Nom)
# Nom Var1 Var2 id
#1 N1 v11 v12 1
#2 N2 . . 2
#3 N2 . . 2
#4 N3 V32 V32 3
我正在尝试使用可以正常工作的命令行创建一个函数。我正在为看起来像这样的数据集创建标识符
Nom Var1 Var2
N1 v11 v12
N2 . .
N2 . .
N3 V32 V32
我的命令是:transform(df$Nom, id=match(df$Nom, unique(df$Nom)))
并且工作正常。
但是,如果我在下面写一个像 ht 这样的函数;我收到错误:"unique applies only to vectors"
createid<-function(var){
x<- transform(var, id=match(var, unique(var)))
ids<-paste0("id_",x[,2])
return(ids)
}
df$id<-createid(df$Nom)
类似地,如果 Y 编写以下函数,我会得到错误 Error in d$var : object of type 'closure' is not subsettable
createid<-function(d,var){
x<- transform(d$var, id=match(d$var, unique(d$var)))
ids<-paste0("id_",x[,2])
return(ids)
}
df$id<-createid(d,Nom)
我认为您在 R 中编写函数的方式有一些我不理解的地方,尤其是当您在数据框中调用变量时。有人可以帮我弄这个吗? 谢谢
您可以在不使用 transform
的情况下执行此操作。正如@LyzandeR 在评论中提到的,最好使用 d[[var]]
而不是 d$var
。
createid <- function(d, var){
d$id <- match(d[[var]], unique(d[[var]]))
d }
createid(df, 'Nom')
# Nom Var1 Var2 id
#1 N1 v11 v12 1
#2 N2 . . 2
#3 N2 . . 2
#4 N3 V32 V32 3
或者如果你真的想使用$
,那么你可以使用eval(parse(
,但不推荐这条路线,也不是那么简单。
createid1 <- function(d, var){
m1 <- match.call()
e1 <- eval(parse(text=paste0(deparse(m1$d),'$',m1$var)))
d$id <- match(e1, unique(e1))
d}
createid1(df, 'Nom')
# Nom Var1 Var2 id
#1 N1 v11 v12 1
#2 N2 . . 2
#3 N2 . . 2
#4 N3 V32 V32 3
或者代替eval(parse
createid2 <- function(d, var){
args <- as.list(match.call())
e1 <- eval(args$var, d)
d$id <- match(e1, unique(e1))
d
}
createid2(df, Nom)
# Nom Var1 Var2 id
#1 N1 v11 v12 1
#2 N2 . . 2
#3 N2 . . 2
#4 N3 V32 V32 3