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