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