我有以下格式的数据:
site location treatment response
1 1 1 20
1 1 2 30
1 1 3 30
1 2 1 80
1 2 2 30
1 2 3 50
1 3 1 10
1 3 2 15
1 3 3 100
1 4 1 25
1 4 2 20
1 4 3 90
每个站点的多个站点和 10 个位置。
我希望创建三个新变量,treat1、treat2 和treat3,指的是三种治疗方法,它们采用每个站点/位置组合的响应值。但是,我希望他们为所有三个治疗记录取值。即一个数据框,如:
site location treatment response treat1 treat2 treat3
1 1 1 20 20 30 30
1 1 2 30 20 30 30
1 1 3 30 20 30 30
1 2 1 80 80 30 50
1 2 2 30 80 30 50
1 2 3 50 80 30 50
1 3 1 10 10 15 100
1 3 2 15 10 15 100
1 3 3 100 10 15 100
1 4 1 25 25 20 90
1 4 2 20 25 20 90
1 4 3 90 25 20 90
为了实现这一点,我使用了一个相当冗长的解决方案(6 行代码 - 请参见下文),但我想知道是否有人可以指出更直接的方法:
对待1:
df$trt1 <- ifelse(df$treatment==1, df$response, NA)
df2 <- aggregate(df$trt1, list(df1$location, df$site), max, na.rm=TRUE)
df3 <- rbind(df2, df2, df2)
df4 <- df3[with(df3, order(Group.2, Group.1)),]
df$x <- ifelse(df4$x==-Inf, NA, df4$x)
names(df)[names(df) == 'x'] <- 'treat1'
我怀疑 tapply 在这里可能有用,但我不确定如何在这种情况下使用它。
谢谢你。