将变量名称传递给sapply

时间:2014-01-19 10:43:26

标签: r variables matrix sapply

这是一个玩具数据集:

df1 <-data.frame(c("267119002","257051033",NA,"267098003","267099020","267047006"))
names(df1)[1]<-"ID"

df2 <-data.frame(c("257051033","267098003","267119002","267047006","267099020"))
names(df2)[1]<-"ID"
df2$vals <-c(11,22,33,44,55)

和玩具代码:

fetcher <-function(x){
  y <- df2$vals[which(match(df2$ID,x)==TRUE)]
  return(y) 
}

sapply(df1$ID,function(x) fetcher(x))

sapply语句中,我需要使用变量名,而不是使用df1$ID。如:

col <-"ID"
sapply(df1[col],function(x) fetcher(x))

然而,当我这样做时,它不会遍历df1$ID的所有值。这样,它只对第一个值sapply。示例输出:

> sapply(df1[col],function(x) fetcher(x))
ID 
33 
> sapply(df1$ID,function(x) fetcher(x))
[1] 33 11 22 55 44

那为什么会这样呢?我需要使用变量名而不是确切的列名,因为我需要将它应用于不同的列,每次运行时都会有所不同。但是我需要它才能应用于每一行而不仅仅是第一行。

1 个答案:

答案 0 :(得分:3)

区别在于df1[col]返回一列数据框,df1$ID返回一个向量/因子。使用您的代码,您需要一个矢量/因子,因此您可以

使用df1[, col]

sapply(df1[, col],function(x) fetcher(x))

或双括号df1[[col]]

sapply(df1[[col]],function(x) fetcher(x))