2016-02-11 28 views
3

我有一個問題涉及在dplyr的新列中使用基於其他兩列的mutate函數創建最小值。mutate在每行中創建最小值

以下代碼爲新列中的每一行重複相同的值。有沒有辦法爲新列中的每一行創建獨立的最小值?我希望避免由於速度而使用循環或應用系列,並且如果可能的話,希望堅持使用dplyr。這裏的代碼:

a = data.frame(runif(5,0,5)) 
b = data.frame(runif(5,0,5)) 
c = data.frame(runif(5,0,5)) 

y = cbind(a,b,c) 

colnames(y) = c("a","b","c") 

y = mutate(y, d = min(y$b, y$c)) 

y 

新列「d」只是重複相同的數字。有關如何解決這個問題的建議,使其成爲每行中「b」和「c」的最小值?

謝謝你的幫助。

+1

創建'y'的一個簡單方法是'y = data.frame(a,b,c)',那麼你不需要單獨設置'colnames'。 – ytk

+0

好點 - 謝謝 – AME

回答

2

我們可以使用pmin

y$d <- with(y, pmin(b, c)) 

或者

transform(y, d = pmin(b,c)) 

或用dplyr

library(dplyr) 
y %>% 
    mutate(d = pmin(b,c)) 

min作品縱列,想如果我們要使用min,一個選擇是

y %>% 
    rowwise %>% 
    mutate(d = min(unlist(c(b,c)))) 
+1

那(pmin)工作。謝謝。我可以接受答案(7分鐘後)。真的很感激它。 – AME

0

你可以使min功能由行而不是列應用使用apply功能和margin參數設置爲MARGIN = 1。你橫行分函數應該是這樣的:

apply(y, MARGIN = 1, FUN = function(x) min(x))) 

然後,爲了使橫行分鐘功能只適用於列B和C,可以內mutate使用select功能,像這樣:

y %>% mutate(b.c.min = 
    y %>% 
    select(one_of("b", "c")) %>% 
    apply(MARGIN = 1, FUN = function(x) min(x))) 
相關問題