R管道符(%>%)在以下情况下的使用方法

How to use the R pipe operator (%>%) in the following cases

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

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

变量 myvar 不包含在数据框中,它是一个 "flag" 变量,其值为 "A" 或 "B"。当 "A" 时,想在数据框中创建一个名为 "newColumn" 的新列,该列是旧列(名为 "oldColumn")的三倍,否则与旧列相同。

2) 想将名为"numbers"的列与另一个名为"seconds"的列中具有最小值的数字条目分开,如下:

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

如何使用 mutate 命令和“%>%”来做到这一点,使其看起来更方便?不幸的是,我尝试过的任何东西都不起作用。

感谢您的回答, J.

如果 myvar 只是一个在 environmnet 中浮动的变量,您可以在 mutate 中使用 if else 语句(类似问题

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")的运算符。然后你可以过滤到具有最小秒值的行(top_n 语句使用 -1 作为参数),并提取数字变量的值

# 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))