基于组的条件算法的新变量

时间:2014-03-26 16:35:21

标签: r dataframe conditional plyr

我有一个data.frame df,我想创建一个新的变量,它是另一个按组的比例。这是针对每个Species ID Plot Sub配对,我希望找到AreaType的比例。如果Type = 0,那么PropArea == 1,如果Type不等于0(即1或2),那么,例如PropArea = {{1 (类型1)/ Area(类型0)。下面是一个示例data.frame。我知道如何使用excel中的if语句执行此操作,但希望在Area中找到一种方法来执行此操作。

r

3 个答案:

答案 0 :(得分:1)

只要您对使用的data.frame感到满意,这应该可行:

library(plyr)
df2 <- ddply(df_more, .(Species, ID, Plot, Sub), function(groupdf) {
  denominator <- groupdf[groupdf$Type==0,"Area"]
  if(length(denominator) == 0) denominator <- groupdf[groupdf$Type==1,"Area"]
  transform(groupdf, PropArea=Area/denominator)
})

如果您想保持相同的顺序,请添加以下行:

df1 <- df2[match(
  interaction(df[c("Species", "ID", "Plot", "Sub", "Type")]), 
  interaction(df2[c("Species", "ID", "Plot", "Sub", "Type")])),]

答案 1 :(得分:0)

如果您可以保证在您的示例中将012交替使用,则可以使用ifelse

df$PropArea <- ifelse(df$Type == 0, 1, df$Area / c(1, df$Area[-nrow(df)]))

答案 2 :(得分:0)

df_more数据集中有重复项。 例如。 DIVI / 22/1/2/0的面积分别为7.50和7.42。 这将导致错误。