在R中如何在满足条件时划分一行

时间:2014-09-23 01:45:18

标签: r dataframe factors

我有一堆与唯一值相关联的方法。唯一值是我在两个不同基板上测试的线。在R中我想构建一个循环,该循环将采用唯一值并将基板A的平均值(pheno_output)除以基板B.并将其吐入新的矢量。

这就是我正在做的事情。

tmpmeans<-  rep(NA, 2);

for (i in unique(SplitnonMEANs$Line)){
  tmpmeans<- SplitnonMEANs$pheno_output[i]/SplitnonMEANs$pheno_output[i]
}

示例数据:

s;

Line phenotype FoodSource pheno_output
1    non        A           123
2    non        A           456
1    non        B           789
2    non        B           159

任何人都可以帮我这么做吗?

2 个答案:

答案 0 :(得分:1)

如果每组只有两个值,则可以使用其中任何一个

divide <- function(x) {
    stopifnot(length(x) == 2L)
    x[1L]/x[2L]
} 
aggregate(pheno_output ~ Line, df, divide)
#   Line pheno_output
# 1    1    0.1558935
# 2    2    2.8679245
with(df, tapply(pheno_output, Line, divide))
#         1         2 
# 0.1558935 2.8679245 
sapply(split(df$pheno_output, df$Line), divide)
#         1         2 
# 0.1558935 2.8679245 

答案 1 :(得分:0)

使用data.table会更快

 library(data.table)
  setDT(df)[,list(pheno_output=ifelse(.N==2, pheno_output[1]/pheno_output[2], NA_real_)), by=Line]
  #  Line pheno_output
 #1:    1 0.1558935
 # 2:   2 2.8679245