添加新的(较短的)列以进行tibble和扩展tibble以保持整洁

时间:2018-04-03 18:20:00

标签: r tidyr

我有一个数据框,我需要添加一列来包含与现有数据帧的每一行对应的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种。我对所有匹配的东西都很偏执。

3 个答案:

答案 0 :(得分:6)

如何使用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")

答案 1 :(得分:3)

利用rep方法的基础R解决方案:

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

答案 2 :(得分:1)

另一个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