我有以下提示:
library(dplyr)
df <- tibble(v1 = c(1,-1,1), min = c(2,3,4), max = c(4,5,6))
哪个给我:
# A tibble: 3 x 3
v1 min max
<dbl> <dbl> <dbl>
1 1 2 4
2 -1 3 5
3 1 4 6
如果min
的值为max
,我想用v1
来填充-1
的值。第二行就是这种情况(我想得到min = 5和max = 3)。我想用dplyr
来做。我知道我必须使用第三个临时变量,但无法在dplyr
中使用它。
答案 0 :(得分:3)
base R
中一个更简单的选择是创建基于'v1'的逻辑索引,然后通过翻转rhs
和lhs
赋值表达式中的列进行赋值
i1 <- df$v1 == -1
df[i1, c("min", "max")] <- df[i1, c("max", "min")]
df
# A tibble: 3 x 3
# v1 min max
# <dbl> <dbl> <dbl>
#1 1 2 4
#2 -1 5 3
#3 1 4 6
使用filter/bind_rows
的选项为
df %>%
filter(v1 == -1) %>%
rename_all(~ c("v1", "max", "min")) %>%
bind_rows(df %>%
filter(v1 != -1))
答案 1 :(得分:2)
使用base
(关于替换从@akrun的答案中借用的最大值的想法):
within(df,{ min<-ifelse(v1==1,min,max)
max <- ifelse(df$v1==-1,df$min,df$max)
})
A tibble: 3 x 3
v1 min max
<dbl> <dbl> <dbl>
1 1 2 4
2 -1 5 3
3 1 4 6
答案 2 :(得分:1)
这是内 dplyr
-
df %>%
mutate(
min2 = min,
min = ifelse(v1 == -1, max, min),
max = ifelse(v1 == -1, min2, max),
min2 = NULL
)
# A tibble: 3 x 3
v1 min max
<dbl> <dbl> <dbl>
1 1 2 4
2 -1 5 3
3 1 4 6