突变何时使用变量的行元素而不是整个列向量?

时间:2019-02-22 21:31:52

标签: r tidyverse purrr

我一直在试图理解何时需要使用Apply或Map函数以及在其中使用公式的方法,但没有取得太大的成功,因为我看不到所谓的调用背后的逻辑。这是一个使用mutate的简单示例:

library(tidyverse)
df <- tibble(
  a = 1:5,
  b = 3:7,
  c = 5:9
)

df %>% 
  mutate(new = a)

new的每个元素都是a的对应元素。

df %>% 
  mutate(new = 1 == a)

new的每个元素都是TRUE,则为false,具体取决于a的相应元素。

df %>% 
  mutate(new = 3 %in% a)

new的每个元素都是相同的,它检查3是否在整个向量a中,而不仅仅是对应的元素。

那么它何时使用带有匹配行的变量中的元素,何时使用整个变量向量?我看不到可以帮助我确定是否需要使用Apply或Map的逻辑模式。

df %>% 
  mutate(new = str_c(a, b, sep = "..."))

我想也许与功能有关,但是在这里它使用a和b的对应元素,而不是整个向量。

类似地,如果我的标题中有列表向量:

df2 <- tibble(
  prb = c(0.2, 0.5, 0.3),
  dist = list(rnorm(5, sd = 1), 
           rnorm(5, sd = 5),
           rnorm(5, sd = 10))
)

df2 %>% 
  mutate(new = prb * dist)

这会产生错误,即使0.2 * rnorm(5,sd = 1)不会。

df2 %>% 
  mutate(one = map2(prb, dist, ~.x * .y))

所以我必须使用类似这样的东西。为什么?

df2 %>% 
  mutate(new = dist)

这会复制dist列,因此它必须查看dist的每个元素?

df2 %>% 
  mutate(new = dist[1])

但这不能按我的意愿工作,因为它返回整个dist列表的第一个元素(它是5个值的向量)。我想要与每一行相对应的向量的第一个元素,因此它返回一个数字。是的,我知道我可以使用map函数和公式来做到这一点,但是为什么起作用或不起作用背后的逻辑是什么?

0 个答案:

没有答案