如何根据第三列的值来排列小标题的两列?

时间:2019-07-23 20:04:11

标签: r dplyr

我有以下提示:

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中使用它。

3 个答案:

答案 0 :(得分:3)

base R中一个更简单的选择是创建基于'v1'的逻辑索引,然后通过翻转rhslhs赋值表达式中的列进行赋值

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