2014-01-19 43 views
0

這裏是一個玩具數據集:傳遞變量名稱爲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 

那麼爲什麼會發生這種情況呢?我需要使用變量名稱而不是確切的列名稱,因爲我需要將其應用於每次程序運行時不同的列。但我需要它適用於每行而不僅僅是第一行。

回答

2

區別在於df1[col]返回一列數據幀,而df1$ID返回一個向量/因子。使用你想要一個矢量/因子你的代碼,因此你可以

使用df1[, col]

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

或雙括號df1[[col]]

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

+0

非常感謝,完美的作品!我學到了一些可以啓動的東西!非常感謝Mark! – user2498193

相關問題