• R语言
  • 为什么有的命令写成function跟单独使用结果不一?

各位大神,同一个操作单独执行可以写成function为啥结果会不一样啊?
我遇到的情况是这样,
A是data.frame,B是data.frame, ID是A,B里面都有的变量,我就想把B里面有的ID从A中找出来然后整个行都删除掉
上个帖子有大神给了个简单的方法让
A=A[ !(A$ID %in% B$ID), ]
单独两个A,B出来运行的很好,把A中ID跟B有重复的都删除了
但是我写成function的形式
matchdropID=function(a,b,ID){
c=a[ !(a$ID %in% b$ID), ]
c
}
然后运行
A=matchdropID(A,B,ID)
为啥A里面最后结果就一个都不剩了? :cry:
[未知用户]
感谢回复,原来把ID去了就可以了

但是我现在对function里面的argument怎么定义又糊涂了。我其实希望的function里面的A,B,ID其实跟最开始的A,B,ID定义一样。本意其实就是两组data.frame A跟B中有重复的行,可以用ID来match,然后找出来A,B中都有的从A中删除,其实要的就是这个效果
A <- data.frame(ID=1:5,X=rnorm(5))
B <- data.frame(ID=c(2,4,6),X=rnorm(3))
A[ !(A$ID %in% B$ID), ]
我是希望能写个function,只要指定了A,B以及A,B中都有的一个变量ID,就能自动根据ID这个变量来match两组数据,然后把A中重复的行都删除。

去掉ID以后原来的function能用了,但是不能指定用来match的变量名了,我是希望变量名也能指定,省的每次重写function或者改变量名。

另外我还想请问下大神如何循环使用这个function,比如我有data.frame A,B,C,D,E....一直到G,我希望能A里面把跟B重复出现的行删除,再删除跟C重复的,一直删除到G,我试着把A到G批量导入到一个datalist里面,datalist[[1]]=A,然后datalist[[2]]=B.....一直到data.list[[10]]=G

然后
matchdropID=function(a,b){
c=a[ !(a$ID %in% b$ID), ]
c
}
for( i in 2:10){
datalist[[1]]=matchdropID(datalist[[1]],datalist[[i]])
}
A=datalist[[1]]
这样对吗?
试试下面代码,应该能满足你的要求,后面顺便写了个例子验证你的想法。Works for me:)
matchdropVAR <- function(dfA, dfB, var){
  res <- dfA[!(dfA[, var] %in% dfB[, var]), ]
  return(res)
}

A <- data.frame(ID=1:10,X=rnorm(10))
B <- data.frame(ID=2,X=rnorm(1))
C <- data.frame(ID=3,X=rnorm(1))
D <- data.frame(ID=4,X=rnorm(1))
E <- data.frame(ID=5,X=rnorm(1))
F <- data.frame(ID=6,X=rnorm(1))

datalist <- list(A, B, C, D, E, F)

for( i in seq_along(datalist)){  
  if(i==1) next
  datalist[[1]] <- matchdropVAR(datalist[[1]], datalist[[i]], "ID")
}