请帮助我理解为什么 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))
我有一个包含 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))