2015-02-05 77 views
2

朋友,我是R新手,但是,我陷入了其中一個問題。事情是,我有一個與數學函數(平均值,最小值,最大值等)的數據框中的列,我有另一個數據框與行數相同的功能,我想將這些特定的功能應用到數據幀。將函數列表應用到另一個數據框中的行中R

下面爲df具有特定的數學函數

var1 funct 
1 A  min 
2 B  max 
3 C  mean 
4 D  min 

下面如果DF到這些功能需要應用(上行)

a1 b1 c1 d1 
1 4 8 12 15 
2 NA 9 13 16 
3 6 10 NA 17 
4 7 11 15 18 

假設第一FN需要被施加到第一排等。有人能幫忙嗎?我試過do.call,解析(eval),但我失敗了。注意:有NA,但是,我想每一行的結果(即排除NA,但不能刪除該行本身)

問候,

回答

2

調用帶有功能df1第一個數據幀和行df2與數據的數據幀,然後,

mapply(function(f,x) get(f)(x,na.rm=TRUE), df1$funct, as.data.frame(t(df2))) 

會產生

min max mean min 
    4 16 11 7 
+0

或者另一個人會'vapply(seq_len(nrow(DF2)),函數(I)的eval(as.name(DF1 $本功能[I]))(不公開(df2 [i,]),na.rm = TRUE),numeric(1L)) #[1] 4 16 11 7' – akrun 2015-02-05 18:48:13

+0

@akrun如果你打算'eval',那麼'mapply(function )eval(call(f,unlist(df2 [r,]),na.rm = TRUE)),df1 $ funct,1:nrow(df2))' – 2015-02-05 18:55:06

+0

非常感謝你們,這個論壇真棒!感謝一羣A.Webb,akrun,Jthorpe爲此付出了時間。 :)我可能會有一個最近添加的查詢,目前正在解決它,但如果無法這樣做會將其發佈到此處。 – 2015-02-06 09:26:33

3

試試這個:

df2 <- read.csv(textConnection("a1,b1,c1,d1 
4,8,12,15 
NA,9,13,16 
6,10,NA,17 
7,11,15,18")) 


df1 <- read.csv(textConnection("var1,funct 
A,min 
B,max 
C,mean 
D,min")) 

df1$funct <- as.character(df1$funct) 

x <- mapply(do.call, 
     as.list(df1$funct), 
     lapply(split(df2,seq(nrow(df2))), 
       function(x)list(na.omit(unlist(x))))) 

(該lapply(split(...),list))是因爲do.call需要它的第二個參數是一個列表。)

相關問題