Пожалуйста, помогите мне понять, почему мутация это делает - PullRequest
1 голос
/ 20 апреля 2020

У меня есть фрейм данных "dat2" из 40 obs x 3 переменных. Я хочу добавить столбец "tx", основанный на 2 векторах: "treatment" (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(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

Я знаю, что я мог бы просто обойти, создав вектор с повторениями и затем использовать этот вектор для определения «tx» внутри мутирования, но я хочу понять, почему 'rep' ведет себя по-разному внутри mutate.

Спасибо !!

1 Ответ

0 голосов
/ 20 апреля 2020

Проблема в том, что mutate ожидает, что длина вывода будет равна числу строк. Если это не так, он выдаст ошибку. Мы можем обернуть его в list, а затем unnest, чтобы развернуть столбец list

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