用dplyr将条件应用于整行

时间:2016-04-25 10:14:34

标签: r dplyr

例如,在data.table中我有三列。我想根据单个列的条件更改每一行。在此示例中,如果列a == 4,则该行的所有列都将乘以4.

使用所有变量编写,如下所示:

a <- c(1,2,3,4,5)
b <- c(2,4,6,7,8)
c <- c(3,6,9,0,3)

data.frame(a,b,c) %>% rowwise() %>% mutate(a=ifelse(a==4,a*4,a),
                                           b=ifelse(a==4,b*4,b),
                                           c=ifelse(a==4,c*4,c))

有没有办法简单地将条件放在一行而不写每一列?我会想象这样的事情:

data.frame(a,b,c) %>% rowwise() %>% mutate(.=ifelse(a==4,.*4,.))

2 个答案:

答案 0 :(得分:3)

这是mutate_each的设计目标,但出于某些原因,所有dplyr解决方案都没有为单元格[4, 'b']提供正确答案。

a <- c(1,2,3,4,5)
b <- c(2,4,6,7,8)
c <- c(3,6,9,0,3)

A <- data.frame(a,b,c) %>% rowwise() %>% mutate(a=ifelse(a==4,a*4,a),
                                                b=ifelse(a==4,b*4,b),
                                                c=ifelse(a==4,c*4,c))
B <- data.frame(a,b,c) %>% mutate(a=ifelse(a==4,a*4,a),
                                  b=ifelse(a==4,b*4,b),
                                  c=ifelse(a==4,c*4,c))

C <- data.frame(a,b,c) %>% 
  mutate_each(funs(ifelse(a == 4, . * 4, .)))

D <- data.frame(a,b,c) %>%
  rowwise() %>%
  mutate_each(funs(ifelse(a == 4, . * 4, .)))

E <- data.frame(a,b,c)
E[E$a == 4, ] <- E[E$a == 4, ] * 4

all.equal(A, B)
#TRUE
all.equal(A, C)
#TRUE
all.equal(A, D)
#TRUE
all.equal(A, E)
#FALSE

zx8754中的基本代码是唯一具有正确答案的代码,而其他代码只有a乘以4。 我不太明白为什么。

这可能是一个错误(?)。您可能需要file an issue on Github

答案 1 :(得分:-1)

您可以通过制作自己的函数将zx8754的解决方案与dplyr结合使用:

multiply.if <- function(x){
   x[x$a == 4, ] <- x[x$a == 4, ] * 4
   return(x)
} 

data.frame(a,b,c) %>% multiply.if()

如果问题更复杂,你可以概括一下这个函数,即:

multiply.if <- function(x, factor = 1){
   x[x$a == factor, ] <- x[x$a == factor, ] * factor
   return(x)
} 

data.frame(a,b,c) %>% multiply.if(4)