行方式操作,选择助手和dplyr中的mutate函数

Sav*_*SUS 6 select r dplyr mutate rowwise

我将使用以下数据集来说明我的问题:

my_df <- data.frame(
    a = 1:10,
    b = 10:1
)
colnames(my_df) <- c("a", "b")
Run Code Online (Sandbox Code Playgroud)

第1部分

我使用该mutate()函数在我的数据集中创建两个新变量,我想计算同一mutate()调用中两个新列的行方式.但是,我真的希望能够使用select()帮助器,如starts_with(),ends_with()contains().

我的第一次尝试:

 my_df %>%
    mutate(
        a_2 = a^2,
        b_2 = b^2,
        mean = rowMeans(select(ends_with("2")))
    )
Error in mutate_impl(.data, dots) : 
  Evaluation error: No tidyselect variables were registered.
Run Code Online (Sandbox Code Playgroud)

我理解为什么会出现错误 - select()函数没有给出任何.data参数.所以我改变了代码......

...我.select()函数内添加" "的第二次尝试:

my_df %>%
    mutate(
        a_2 = a^2,
        b_2 = b^2,
        mean = rowMeans(select(., ends_with("2")))
    )
    a  b a_2 b_2 mean
1   1 10   1 100  NaN
2   2  9   4  81  NaN
3   3  8   9  64  NaN
4   4  7  16  49  NaN
5   5  6  25  36  NaN
6   6  5  36  25  NaN
7   7  4  49  16  NaN
8   8  3  64   9  NaN
9   9  2  81   4  NaN
10 10  1 100   1  NaN
Run Code Online (Sandbox Code Playgroud)

第二次尝试后的新问题是该mean列不包含a_2b_2预期的平均值,但NaN仅包含s.在研究了一下代码之后,我理解了第二个问题.函数中添加的" ." select()是指原始my_df数据框,它没有a_2b_2列.所以NaN生成s是有道理的,因为我要求R计算不存在的值的均值.

然后我尝试使用dplyr诸如current_vars()查看它是否会产生影响的功能:

 my_df %>%
    mutate(
        a_2 = a^2,
        b_2 = b^2,
        mean = rowMeans(select(current_vars(), ends_with("2")))
    )
Error in mutate_impl(.data, dots) : 
  Evaluation error: Variable context not set.
Run Code Online (Sandbox Code Playgroud)

但是,这显然不是使用此功能的方法.解决方案是简单地添加第二个mutate()函数:

 my_df %>%
    mutate(
        a_2 = a^2,
        b_2 = b^2
    ) %>%
    mutate(mean = rowMeans(select(., ends_with("2"))))
    a  b a_2 b_2 mean
1   1 10   1 100 50.5
2   2  9   4  81 42.5
3   3  8   9  64 36.5
4   4  7  16  49 32.5
5   5  6  25  36 30.5
6   6  5  36  25 30.5
7   7  4  49  16 32.5
8   8  3  64   9 36.5
9   9  2  81   4 42.5
10 10  1 100   1 50.5
Run Code Online (Sandbox Code Playgroud)

问题1:有没有办法在同一个mutate()电话中执行此任务?mutate()无论如何,使用第二个功能并不是真正的问题; 但是,我很想知道是否存在引用当前存在的变量的方法.该mutate()函数允许在同一个mutate()调用中创建变量后立即使用变量; 但是,当函数嵌套时,如上例所示,这就成了问题.

第2部分

我也意识到rowMeans()在我的解决方案中使用作品; 然而,它并不是真正的dplyr做事,尤其是因为我需要在其中使用select()它.所以,我决定使用rowwise()mean()函数代替.但是,我再次使用其中一个select()帮助程序,而不必列出c()函数中的所有变量.我试过了:

 my_df %>%
    mutate(
        a_2 = a^2,
        b_2 = b^2
    ) %>%
    rowwise() %>%
    mutate(
        mean = mean(ends_with("2"))
    )
Error in mutate_impl(.data, dots) : 
  Evaluation error: No tidyselect variables were registered.
Run Code Online (Sandbox Code Playgroud)

我怀疑代码中的错误是由于ends_with()不在内部的事实select(),但是我正在展示这是否有一种方法来列出我想要的变量而不必单独指定它们.

感谢您的时间.

Nic*_*jas 0

幸运的是,从 dplyr > 1.0.0 开始,有一种 dplyr 方法可以通过使用 c_across 来完成您正在寻找的任务。这很有用,因为它将解决方案扩展到可能具有 Row 实现(如 RowMeans())的其他函数。

尝试这个:

my_df %>%
  mutate(
    a_2 = a^2,
    b_2 = b^2,
    ) %>% 
  rowwise() %>% 
  mutate( mean = mean(c_across(ends_with("2"))) )
Run Code Online (Sandbox Code Playgroud)