【问题标题】:In R how to divide a row when a condition is met在R中如何在满足条件时划分一行
【发布时间】:2014-09-23 01:45:18
【问题描述】:

我有很多与独特价值相关的手段。唯一值是我在两种不同基材上测试的线条。在 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

谁能帮我做这个?

【问题讨论】:

  • 我不关注。你想要按组的平均值吗?就像aggregate(pheno_output ~ FoodSource, df, mean)的结果一样
  • 我有办法,我想除以 pheno_output 和 foodSource。所以取唯一的 1 并划分 A/B,取唯一的 2 并划分 A/B
  • 好吧,在这种情况下它将是两个,因为我有两个基于 s$Line 的唯一值。对此感到抱歉
  • 请向我们提供您期望的两个数字作为结果
  • 对不起,我认为这是错误的sapply(split(df$pheno_output, df$Line), function(x) x[1]/x[2]) 另外,aggregate(pheno_output ~ Line, df, function(x) x[1]/x[2]) 给出了更好的结果。

标签: r dataframe factors


【解决方案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 

【讨论】:

    【解决方案2】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多