【问题标题】:Calculate median or mean depending on the value of a column根据列的值计算中位数或平均值
【发布时间】:2018-01-29 16:23:06
【问题描述】:

我正在尝试根据列的值计算中位数或平均值。

想象下面的 DF

DF <- data.frame("name", 1:20, 3, 2:5, 0, 8:12)
colnames(DF)<- c("name","sample_1","sample_2", "sample_3", "median_mean", "Frequence")

我想用每行 3 个样本的中值或平均值填充“median_mean”列,具体取决于频率列。如果 Freq 大于或等于 10,则使用中位数,否则使用均值。

请记住,样本并不总是 3,因此我不能使用列 (2:4)。但他们的名字永远是 sample_X。

谁能帮帮我?

【问题讨论】:

  • 你试过什么?你熟悉if 语句吗?从您分享的内容来看,尚不清楚您需要什么级别的帮助。

标签: r mean median


【解决方案1】:
DF <- data.frame("name", 1:20, 3, 2:5, 0, 8:12)
colnames(DF)<- c("name","sample_1","sample_2", "sample_3", "median_mean", "Frequence")

DF$median_mean = ifelse(DF$Frequence>=10, apply(DF[grep("sample_", names(DF))], 1L, median), apply(DF[grep("sample_", names(DF))], 1L, mean))

说明

我们将medianmean 应用到相关列,使用:

  • apply(DF[grep("sample_", names(DF))], 1L, median)

  • apply(DF[grep("sample_", names(DF))], 1L, mean)

但是我们使用三元运算符ifelse的矢量化形式只返回我们想要的值。

该代码也适用于任何数量的名为 sample_X 的列,因为我们概括了列的选择,只需使用 grep("sample_", names(DF)) 搜索它们的名称。

【讨论】:

  • 谢谢!!一些答案完美无缺,但我将使用这个作为它组织在一个向量中!
  • @JM_44 很高兴它帮助了你!请考虑将此答案标记为“已接受”(分数下方的绿色复选标记),因此它在网站中被视为已回答。
  • 我刚刚做了,直到现在我才解锁该特权;)
  • @zx8754 感谢您的编辑,但我已将其回滚,因为 OP 首先接受了它,因为它是单行的,尽管可能存在性能考虑,您的编辑改进了。
  • 没问题,你的帖子由你决定。
【解决方案2】:

遍历行,根据列Frequence得到匹配函数(match.fun):

# sample_ column index
ix <- grepl("sample_", colnames(DF), fixed = TRUE)

DF$median_mean <- apply(DF, 1, function(i){
  myFun <- match.fun(ifelse(i[6] >= 10, "median", "mean"))
  myFun(as.numeric(i[ix]))
})

【讨论】:

    【解决方案3】:
    DF <- data.frame("name", 1:20, 3, 2:5, 0, 8:12)
    colnames(DF)<- c("name","sample_1","sample_2", "sample_3", "median_mean", "Frequence")
    
    DF[DF$Frequence>10,]$median_mean<-apply(DF[DF$Frequence>10,grep("sample_",names(DF))],1,median)
    DF[DF$Frequence<10,]$median_mean<-rowMeans(DF[DF$Frequence<10,grep("sample_",names(DF))])
    

    【讨论】:

      【解决方案4】:

      这行得通,使用 grep 获取列号

      for(i in 1:nrow(DF)){
      
         cols <- grep("sample", names(DF))
         if(DF[i,]$Frequence > 10){
           DF$median_mean[i] <- mean(as.integer(DF[i,cols]))
         }else{
           DF$median_mean[i] <- median(as.integer(DF[i,cols]))
        } 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-28
        • 2014-11-04
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 1970-01-01
        相关资源
        最近更新 更多