在以下情况下如何使用R管道运算符(%>%)

时间:2019-11-27 15:11:30

标签: r pipe magrittr

1)我有一个名为df的数据框,如何在管道运算符中使用的mutate函数中包含if语句?以下内容不起作用:

df %>%
 mutate_if(myvar == "A", newColumn = oldColumn*3, newColumn = oldColumn)

变量myvar不包含在数据帧中,而是一个“标志”变量,其值为“ A”或“ B”。如果为“ A”,则想在数据框中创建一个名为“ newColumn”的新列,该列是旧列(名为“ oldColumn”)的三倍,否则与旧列相同。

2)希望将“ numbers”列除以数字条目,该条目在另一个名为“ seconds”的列中具有最小值,如下所示:

df$newCol <- df$numbers / df[df$seconds== min(df$seconds),]$numbers

我该如何使用mutate命令和“%>%”来使它看起来更方便?不幸的是,我没有尝试过。

感谢您的回答,

1 个答案:

答案 0 :(得分:0)

如果myvar只是在环境中浮动的变量,则可以在mutate中使用if else语句(类似问题here

library(dplyr)
# Generate dataset
df <- tibble(oldColumn = rnorm(100))
# Mutate with if-else conditions
df <- df %>% mutate(newColumn = if(myvar == "A") oldColumn else if(myvar=="B") oldColumn * 3)

如果myvar作为数据框的一列包括在内,则可以使用case_when。

# Generate dataset
df <- tibble(myvar = sample(c("A", "B"), 100, replace = TRUE),
             oldColumn = rnorm(100))

# Create a new column which depends on the value of myvar
df <- df %>%
    mutate(newColumn = case_when(myvar == "A" ~ oldColumn*3,
                                    myvar == "B" ~ oldColumn))

对于问题2,您可以在mutate中使用“。”在该函数右侧调用左侧(即“ df”)的操作符。然后,您可以筛选出具有最小秒数的行(使用-1作为参数的top_n语句),并提取出数字变量的值

# Generate data
df <- tibble(numbers = sample(1:60),
             seconds = sample(1:60))
# Do computation
df <- df %>% mutate(newCol = numbers / top_n(.,-1,seconds) %>% pull(numbers))