2016-07-25 51 views
0

鑑於以下DF:vectorise行,應用向量函數,返回到原來的數據幀[R

a=c('a','b','c') 
b=c(1,2,5) 
c=c(2,3,4) 
d=c(2,1,6) 
df=data.frame(a,b,c,d) 

    a b c d 
1 a 1 2 2 
2 b 2 3 1 
3 c 5 4 6 

我想申請一個函數,通常需要載體(並返回一個向量)像cummax逐行到位置bd的列。

然後,我想將輸出回到df中,作爲df新列中的向量,或者替換原始數據。

我想避免將它編寫爲for循環,它會迭代每一行,將單元格的內容拉出到矢量中,完成它的工作並將其放回原處。

有沒有更高效的方法?我已經給出了應用系列函數,但我正在努力首先獲得一種逐行引導內容並獲得正確輸出的好方法。

最終輸出可能看起來像這樣(想象我已經應用了cummax()函數)。

a b c d 
1 a 1 2 2 
2 b 2 3 3 
3 c 5 5 6 

a b c d output 
1 a 1 2 2 (1,2,2) 
2 b 2 3 1 (2,3,3) 
3 c 5 4 6 (5,5,6) 

其中輸出是一個矢量。

+0

請在你的問題中發佈你想要的結果,你用'4:2'表示的意思不清楚,這是否意味着從列d到列b的'cummax'(按行)? – lmo

+0

事實上,它意味着這些列的逐行cummax。我有edi根據要求定下我的帖子。 – Bastien

回答

1

看來這也只是要cbind到DF簡單apply問題:

> cbind(df, apply(df[ , 4:2] # work with columns in reverse order 
        , 1,  # do it row-by-row 
         cummax)) 
    a b c d 1 2 3 
d a 1 2 2 2 1 6 
c b 2 3 1 2 3 6 
b c 5 4 6 2 3 6 

哎喲。由於未能注意到這將會以列式矩陣的形式返回並需要轉置該結果而被咬住;這樣的新手錯誤。但它確實表明了我想用可重現數據集提出問題的價值。

> cbind(df, t(apply(df[ , 4:2] , 1, cummax))) 
    a b c d d c b 
1 a 1 2 2 2 2 2 
2 b 2 3 1 1 3 3 
3 c 5 4 6 6 6 6 

破壞性地分配結果的df,你只需使用:

df <- # .... that code. 

這確實用逗號串聯(並因此不再需要進行換位:

> cbind(df, output=apply(df[ , 4:2] , 1, function(x) paste(cummax(x), collapse=","))) 
    a b c d output 
1 a 1 2 2 2,2,2 
2 b 2 3 1 1,3,3 
3 c 5 4 6 6,6,6 
+0

OP不需要列的相反順序,只是原始順序。他的帖子已更新以顯示此內容。 – lmo

+0

這很完美!我也遇到了列向矩陣問題。但是我也正在用'apply'寫一些類似'function(x)cummax(x)'的傻話現在,這是一個新手的錯誤... – Bastien

+0

實際上還有一個問題,如果我破壞性地分配了我的輸出,列「a」中的信息正確嗎?我怎麼能阻止呢?我在想的是有點像'dplyr :: mutate',例如,添加到它正在處理的df。 – Bastien