考虑以下数据框
## 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)
但它并没有真正帮助。我觉得这可以通过内置函数(apply
或ifelse
之一)完成,但我无法理解它。
答案 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