【问题标题】:How to use the R pipe operator (%>%) in the following cases在以下情况下如何使用 R 管道运算符(%>%)
【发布时间】:2019-11-27 15:11:30
【问题描述】:

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 命令和“%>%”来做到这一点,这样看起来更方便?不幸的是,我尝试过的任何方法都不起作用。

感谢您的任何回答, J.

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。为什么要强迫自己使用 %&gt;% 运算符?您似乎正在尝试调整控制流,这实际上不是该操作员的用途。 mutate_if 有条件地对列进行变异,它不允许您打开或关闭整个变异操作。

标签: r pipe magrittr


【解决方案1】:

如果 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”)的操作符。然后你可以过滤到最小值为 seconds 的行(top_n 语句使用 -1 作为参数),并拉出 numbers 变量的值

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

【讨论】:

  • 我们可以在这里使用ifelseif_else 而不是case_when
猜你喜欢
  • 2021-08-02
  • 2022-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多