使用dplyr将条件应用于整行

使用dplyr将条件应用于整行,r,dplyr,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),

例如,在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,.))

通过实现自己的功能,您可以将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这就是
mutate\u每个
的设计目的,但由于某些原因,所有的
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

a为什么是dplyr
df[df$a==4,]它比示例更复杂。与dplyr解决方案相比,这将非常慢,不是吗?请尝试提供“复杂”的示例。它位于一个闪亮应用程序的模块中,具有依赖于不同输入的自定义列/行。对不起,如果我的问题不清楚,你的基本解决方案可以解决问题,但这不是我要问的。虽然这是在使用管道,但它实际上没有使用
dplyr
。你说得对,我在这方面跳了枪。我是新来的,所以我不知道我应该删除我的答案还是让它保留?就我所能看到的而言,不是所有a==4的行的列都乘以4,只有a列。嗯,你是对的。我刚刚将我的输出与OP中的长版本匹配。将编辑。。。。
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