【发布时间】:2017-11-30 16:09:57
【问题描述】:
这是一个数据集:
> mydat
species section obs doy ranking
A A1 b1 123 2.1
A A2 b2 135 2.2
A A3 b3 147 2.3
B A1 b2 124 2.2
B A2 b3 132 2.3
B A3 b2 145 2.2
C A1 b1 120 2.1
C A2 b3 133 2.3
C A3 b2 137 2.2
我正在尝试编码;对于obs==b2的每个物种,如果b2的doy > b3的doy,那么ranking=="2.4"。如果b2的doy
> mydat2
species section obs doy ranking
A A1 b1 123 2.1
A A2 b2 135 2.2
A A3 b3 147 2.3
B A1 b2 124 2.2
B A2 b3 132 2.3
B A3 b2 145 2.4
C A1 b1 120 2.1
C A2 b3 133 2.3
C A3 b2 137 2.4
我使用包 plyr 来避免循环,因为我发现循环难以理解。我知道现在很多人使用 dplyr 而不是 plyr,所以我很高兴使用 plyr 或 dplyr 来回答。 这是我笨拙的尝试:
require (plyr)
mydat2 <- ddply(.data=mydat,
.variables=c("species"),
function(x){
return(data.frame(replace(x$ranking, x$doy[x$obs=='b2']>x$doy[x$obs=="b3"],2.4)))})
这可行,但数据集中只剩下物种和排名。如何正确编码以使整个数据集保持排名变化? 感谢您的帮助。
【问题讨论】:
-
您的问题有点难以理解。如果您同时按物种和部分进行拆分,则任何组合的 b2 和 b3 都没有 doy 值,因此您无法比较这些值。同样在您的 ddply 调用中, x 仅包含 mydat 的行,其中 obs == "b2" 但随后您尝试与 x$obs=="b3" 进行比较
-
@user2738526 感谢您的评论,它帮助我改进了代码以更接近我想要的,但现在还在那里。