Добавьте новый (более короткий) столбец в тиббл и разверните тиббл, чтобы он оставался аккуратным

У меня есть фрейм данных, и мне нужно добавить столбец, чтобы включить 3 вида, соответствующие каждой строке существующего фрейма данных. Надеюсь, приведенный ниже пример проясняет это:

Site    Year    Trt
A       2016    bowl
A       2016    vane
A       2017    target
A       2017    stick
B       2016    bowl
B       2016    vane
B       2017    target
B       2017    stick

species<-c("species1", "species2", "species3")

Тогда я хочу добраться до

Site    Year    Trt     Species
A       2016    bowl    species1
A       2016    vane    species1
A       2017    target  species1
A       2017    stick   species1
A       2016    bowl    species2
A       2016    vane    species2
A       2017    target  species2
A       2017    stick   species2
A       2016    bowl    species3
A       2016    vane    species3
A       2017    target  species3
A       2017    stick   species3
B       2016    bowl    species1
B       2016    vane    species1
B       2017    target  species1
B       2017    stick   species1
B       2016    bowl    species2
B       2016    vane    species2
B       2017    target  species2
B       2017    stick   species2
B       2016    bowl    species3
B       2016    vane    species3
B       2017    target  species3
B       2017    stick   species3

Думаю, некоторые rep методы подойдут, но в реальном наборе данных есть два дополнительных столбца и 141 вид. Я становлюсь параноиком по поводу того, что все совпадает правильно.


person Nazer    schedule 03.04.2018    source источник
comment
Каким образом таблица должна знать, сколько раз повторять значение вида? Это должно было сбрасываться при каждом значении чаши? Непонятно, как именно вы хотите, чтобы это работало.   -  person MrFlick    schedule 03.04.2018
comment
@MrFlick Похоже, что после батареи в bowl, vane, target, stick для каждого сайта создается новый вид. Возможно, самым простым было бы разделить данные по сайтам и применить логику появления видов для каждой из 4 записей. Но я согласен, некоторые дополнительные пояснения, попытки и воспроизводимые примеры были бы очень полезны.   -  person Roman Luštrik    schedule 03.04.2018


Ответы (3)


Как насчет использования tidyr::expand для расширения данных как:

library(tidyverse)
expand(data, nesting(Site, Year, Trt), species) %>% as.data.frame()

#     Site Year    Trt  species
# 1     A 2016   bowl species1
# 2     A 2016   bowl species2
# 3     A 2016   bowl species3
# 4     A 2016   vane species1
# 5     A 2016   vane species2
# 6     A 2016   vane species3
# 7     A 2017  stick species1
# 8     A 2017  stick species2
# 9     A 2017  stick species3
# 10    A 2017 target species1
# 11    A 2017 target species2
# 12    A 2017 target species3
# 13    B 2016   bowl species1
# 14    B 2016   bowl species2
# 15    B 2016   bowl species3
# 16    B 2016   vane species1
# 17    B 2016   vane species2
# 18    B 2016   vane species3
# 19    B 2017  stick species1
# 20    B 2017  stick species2
# 21    B 2017  stick species3
# 22    B 2017 target species1
# 23    B 2017 target species2
# 24    B 2017 target species3

Данные

data <- read.table(text = 
"Site    Year    Trt
A       2016    bowl
A       2016    vane
A       2017    target
A       2017    stick
B       2016    bowl
B       2016    vane
B       2017    target
B       2017    stick",
header = TRUE, stringsAsFactors = FALSE)

species<-c("species1", "species2", "species3")
person MKR    schedule 03.04.2018

Базовое решение R, использующее rep метод:

transform(
    do.call('rbind', rep(list(df), length(species))), 
    Species = rep(species, each=nrow(df))
)

#   Site Year    Trt  Species
#1     A 2016   bowl species1
#2     A 2016   vane species1
#3     A 2017 target species1
#4     A 2017  stick species1
#5     B 2016   bowl species1
#6     B 2016   vane species1
#7     B 2017 target species1
#8     B 2017  stick species1
#9     A 2016   bowl species2
#10    A 2016   vane species2
#11    A 2017 target species2
#12    A 2017  stick species2
#13    B 2016   bowl species2
#14    B 2016   vane species2
#15    B 2017 target species2
#16    B 2017  stick species2
#17    A 2016   bowl species3
#18    A 2016   vane species3
#19    A 2017 target species3
#20    A 2017  stick species3
#21    B 2016   bowl species3
#22    B 2016   vane species3
#23    B 2017 target species3
#24    B 2017  stick species3
person Psidom    schedule 03.04.2018

Другим base-R решением может быть следующее (позже вы можете sort на основе столбца Site):

cbind(dat, Species = rep(species, each = nrow(dat)))

#    Site Year    Trt  Species
# 1     A 2016   bowl species1
# 2     A 2016   vane species1
# 3     A 2017 target species1
# 4     A 2017  stick species1
# 5     B 2016   bowl species1
# 6     B 2016   vane species1
# 7     B 2017 target species1
# 8     B 2017  stick species1
# 9     A 2016   bowl species2
# 10    A 2016   vane species2
# 11    A 2017 target species2
# 12    A 2017  stick species2
# 13    B 2016   bowl species2
# 14    B 2016   vane species2
# 15    B 2017 target species2
# 16    B 2017  stick species2
# 17    A 2016   bowl species3
# 18    A 2016   vane species3
# 19    A 2017 target species3
# 20    A 2017  stick species3
# 21    B 2016   bowl species3
# 22    B 2016   vane species3
# 23    B 2017 target species3
# 24    B 2017  stick species3
person M--    schedule 03.04.2018