Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 创建r函数的误区_Database_R_Function_Unique - Fatal编程技术网

Database 创建r函数的误区

Database 创建r函数的误区,database,r,function,unique,Database,R,Function,Unique,我正在尝试创建一个命令行正常工作的函数。我正在为数据集创建一个标识符,如下所示 Nom Var1 Var2 N1 v11 v12 N2 . . N2 . . N3 V32 V32 我的命令是:transform(df$Nom,id=match(df$Nom,unique(df$Nom)),效果很好。 然而,如果我在一个函数后面写一个类似ht的函数;我得到一个错误:“唯一只适用于向量” createid您无需使用transform即可完成此操

我正在尝试创建一个命令行正常工作的函数。我正在为数据集创建一个标识符,如下所示

Nom Var1  Var2
N1    v11   v12
N2     .     .
N2     .     .
N3    V32   V32
我的命令是:
transform(df$Nom,id=match(df$Nom,unique(df$Nom))
,效果很好。 然而,如果我在一个函数后面写一个类似ht的函数;我得到一个错误:“唯一只适用于向量”


createid您无需使用
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(解析

  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

createid2您还可以包括df的创建吗?与df一样,通常
transform
第一个参数是
data
本身,而不是向量。即
transform(df,id=match(Nom,unique(Nom))[-(2:3)]
d$var
如果分别传递
d
var
参数,则函数将不起作用。请改用
d[['var']]
。这就是为什么在d$var中出现
错误的原因:“closure”类型的对象不可子集
error@LyzandeR请以solution@akrun谢谢阿克伦:)。这只解决了他一半的问题,另一半由你解决了哈哈。这就是我没有发帖的原因。非常感谢,这似乎很好用。作为一般规则,是否总是不可能在使用参数指定的函数中使用
df$var
(df,var)
df[['var']]
df$var
之间函数内部的区别是什么?回答得好。谢谢你的发帖。为了回答杜恩的问题,您永远不能将df$var与单独的
df、var参数一起使用。您可以在控制台上找到
df$var
df[['var']]
之间的区别。谢谢@LyzandeR。Doon_Bogan:我想说的是,最好使用
[[
,因为它不易混淆,这里清楚地提到了它们之间的区别
?'['
。但是如果你想使用
$
,你可以通过
评估(解析)(
这不是推荐的路线。我可以用这个功能更新帖子。@akrun,哦,我不是特别想要
$
接线员。我只是好奇为什么它在某些情况下有效,而在其他情况下无效。谢谢你的提问!
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
   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
  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