【问题标题】:Dplyr mutate : making the difference between vector to be taken element wise and vectors to be taken as vectorDplyr mutate:使向量被视为元素明智和向量被视为向量之间的差异
【发布时间】:2018-12-08 18:22:24
【问题描述】:

我正在使用 dplyr 来操作数据。我有两列:x 和 y。在第三列(比如 z)中,我希望在所有 x 列中都有 y 的第一个索引。

例如:

对于第一行,我得到 4,因为 7 在 x 中的第 4 位。

所以我试过了

df <- df %>% 
  mutate(z = which (x==y)[1])

但是比较是按元素进行的(即我在 z 中只得到了五)。因此我的问题是:如何在 dplyr mutate 中区分要采用元素的向量和要作为向量的向量?

【问题讨论】:

  • 可能是mutate(z = match(y, x))。只要所有的 y 肯定都在 x 中。
  • 谢谢!这确实适用于这种特定情况! (也让我意识到 z 的第二个值应该是 3,而不是 2!)。但是更一般的问题呢?

标签: r dplyr


【解决方案1】:

dplyr 不决定该函数是否按元素应用。 mutate 只提供了一种语法,可以让您更简洁地使用其他功能,因为如果您在 mutate 中引用 x,您可能是指 df 中的列 df$x。它还执行一个简单的广播步骤,如果您向它提供一个仅返回单个值的函数,它会将其复制到整个输出中。

我们可以在下面的 dplyr 之外使用 whichmatch 显示相同的行为。因为== 进行元素比较,所以您的第一个方法返回所有5。另一方面,@ 987654332@ “返回其第二个参数的(第一个)匹配位置的向量”(来自文档),这就是您想要的。我比较了底部的两种语法,以表明关键是您提供的决定如何读取输入的函数,而不是mutate

x = c(1,2,3,7,9)
y = c(7,3,9,1,9)

x == y
#> [1] FALSE FALSE FALSE FALSE  TRUE
which(x == y)
#> [1] 5

match(y, x)
#> [1] 4 3 5 1 5

library(dplyr)
df <- data.frame(x, y)
df$z1 = match(df$y, df$x) # a base R syntax that forces you to specify the data frame name
df <- df %>% mutate(z2 = match(y, x)) # dplyr syntax that is more concise
df # they produce the same result
#>   x y z1 z2
#> 1 1 7  4  4
#> 2 2 3  3  3
#> 3 3 9  5  5
#> 4 7 1  1  1
#> 5 9 9  5  5

reprex package (v0.2.0) 于 2018 年 6 月 29 日创建。

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2020-03-05
    • 2014-03-09
    • 2013-12-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多