【发布时间】:2020-04-20 19:15:44
【问题描述】:
我有一个包含 40 个 obs x 3 个变量的数据框“dat2”。我想添加一列“tx”,基于 2 个向量:“治疗”(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
我知道我可以通过使用 reps 创建一个向量然后使用该向量在 mutate 中定义“tx”来解决问题,但我想了解为什么“rep”在 mutate 中的行为不同。
谢谢!!
【问题讨论】:
-
更严格的行为是一个有意的特性——tidyverse 的开发人员希望避免“为了方便”而做出无形假设的情况,例如重复一个向量以适应数据框,这会产生以下行为:可能不明显。有道理,但有时肯定会给编码人员带来额外的工作