按数据框中的因子分组操作

时间:2014-01-13 11:27:40

标签: r

考虑以下数据框

 ## Example data frame
    z1<-c("a", "b", "c", "c", "b", "a", "a", "b", "c") ##groups
    z2<-c("x", "x", "x", "y", "y", "y", "z", "z", "z") ##experiments
    z3<-c(2,4,8,15,9,3,1,2,3)                          ##results
    df<-data.frame(group=z1, id=z2, res=z3)            ##z1, z2, and z3 to data frame

我想自动生成列z4),这是z3中数据的倍数更改。

我想要执行的计算是:

  

a / a&amp; b / a&amp; c / a表示id = x和c / a&amp; b / a&amp; c / a表示id = y等。

并将结果添加到数据框的新列中。

即,

df$z4 <- c(1,2,4,5,3,1,1,2,3) ## by hand

我的想法是,我应该通过以下方式解决问题:

###function to check whether group=a, returns TRUE/FALSE
checkA<-function(x){
  if(x=="a"){
    res=TRUE
  }else {
    res=FALSE
  }
return(res)
}

### checks whether a is in df$group
df$check<-lapply(df$group, checkA)

但它并没有真正帮助。我觉得这可以通过内置函数(applyifelse之一)完成,但我无法理解它。

1 个答案:

答案 0 :(得分:2)

您可以使用by将函数应用于数据子集:

df$z4 <- unlist(by(df, df$id, FUN = function(x) x$res / x$res[x$group == "a"]))

df
  group id res z4
1     a  x   2  1
2     b  x   4  2
3     c  x   8  4
4     c  y  15  5
5     b  y   9  3
6     a  y   3  1
7     a  z   1  1
8     b  z   2  2
9     c  z   3  3