繁体   English   中英

下列情况下如何使用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 不包含在数据框中,它是一个“标志”变量,值为“A”或“B”。 当“A”时,希望在数据框中创建一个名为“newColumn”的新列,该列是旧列(名为“oldColumn”)的三倍,否则与旧列相同。

2) 想将名为“numbers”的列与名为“seconds”的另一列中具有最小值的数字条目相除,如下所示:

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

我怎样才能用 mutate 命令和 "%>%" 来做到这一点,让它看起来更方便? 不幸的是,我尝试过的任何方法都不起作用。

感谢您的回答,J。

如果 myvar 只是一个漂浮在环境中的变量,您可以在 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 作为参数),并拉出 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM