请帮助我理解为什么 mutate 这样做

Please help me understand why mutate does this

我有一个包含 40 个 obs x 3 个变量的数据框 "dat2"。我想添加一列 "tx",基于 2 个向量:"treatments"(5 个元素)和 "ET"(4 个元素)。

treatments <- c("ctrl", "204", "226", "204+226", "blina")
ET <- c("10:1", "5:1", "2.5:1", "T only")

如果我像这样组合向量:

rep(rep(treatments, each=2), length(ET))

我得到了一个长度为 40 的向量,如我所愿。

> rep(rep(treatments, each=2), length(ET))
 [1] "ctrl"    "ctrl"    "204"     "204"     "226"     "226"     "204+226"
 [8] "204+226" "blina"   "blina"   "ctrl"    "ctrl"    "204"     "204"    
[15] "226"     "226"     "204+226" "204+226" "blina"   "blina"   "ctrl"   
[22] "ctrl"    "204"     "204"     "226"     "226"     "204+226" "204+226"
[29] "blina"   "blina"   "ctrl"    "ctrl"    "204"     "204"     "226"    
[36] "226"     "204+226" "204+226" "blina"   "blina"  

但是,如果我在 mutate 中使用同一行:

mutate(dat2, tx = rep(rep(treatments, each=2), length(ET)))

它不起作用,因为它似乎生成了 400 个元素:

Error: Column `tx` must be length 40 (the number of rows) or one, not 400

我知道我可以通过使用代表创建向量然后使用该向量在 mutate 中定义 'tx' 来解决问题,但我想了解为什么 'rep' 在 mutate 中表现不同。

谢谢!!

问题是 mutate 期望输出的长度与行数相同。如果不是那样,它会抛出错误。我们可以将其包装在 list 中,然后 unnest 以展开 list

library(dplyr)
library(tidyr)
dat2 %>%
    summarise(tx = list(rep(rep(treatments, each=2), length(ET))))  %>%
    unnest(c(tx))