【问题标题】:R How to count occurrences of values across multiple columns of a data frame and save the columnwise counts from a particular value as a new row?R如何计算数据框多列中值的出现次数并将特定值的列计数保存为新行?
【发布时间】:2013-12-16 20:04:08
【问题描述】:

我有一个大数据框(大约 1,000 行和 30,000 列),如下所示:

   chr pos  sample1 sample2 sample3 sample 4
    1 5050    1       NA      0       0.5
    1 6300    1       0       0.5     1
    1 7825    1       0       0.5     1
    1 8200    0.5     0.5     0       1

在给定的“chr”和“pos”处,给定样本的值可以采用 0、0.5、1 或 NA 的形式。我要执行大量查询,需要根据每个样本的值汇总对数据框进行子集化和排序。

我想计算每列给定值(例如 0.5)出现的次数,并将其保存为我的数据框中的新行。我的最终目标是能够使用新行的值来对我的数据框的列进行子集化和/或排序。我已经看到有关计数出现的类似问题,但我似乎无法找到/识别一种解决方案来同时在所有列中执行此操作并将特定值的按列计数保存为新行。

【问题讨论】:

    标签: r count find-occurrences


    【解决方案1】:

    与@Jilber 非常相似。假设您的数据位于数据框df

    lst      <- colnames(df[,-(1:2)])
    count.na <- sapply(lst,FUN=function(x,df){sum(is.na(df[,x]))},df)
    count.00 <- sapply(lst,FUN=function(x,df){sum(df[,x]==0,na.rm=T)},df)
    count.05 <- sapply(lst,FUN=function(x,df){sum(df[,x]==0.5,na.rm=T)},df)
    count.10 <- sapply(lst,FUN=function(x,df){sum(df[,x]==1.0,na.rm=T)},df)
    
    df <- rbind(df, 
                c(NA,NA,count.na), 
                c(NA,NA,count.00), 
                c(NA,NA,count.05), 
                c(NA,NA,count.10))
    

    您可能希望将最后一个 rbind(...) 语句中的 NA 替换为可识别您计数的内容。

    【讨论】:

      【解决方案2】:

      您可以将函数应用于 data.frame 的所有列。假设您要计算data.frame d每一列中'A'的数量

      #a sample data.frame
          L3 <- LETTERS[1:3]
           (d <- data.frame(cbind(x = 1, y = 1:10), fac = sample(L3, 10, replace = TRUE)))
      
      
      
      # the function you are looking for
          apply(X=d,2,FUN=function(x) length(which(x=='A')))
      

      【讨论】:

      • 谢谢!我将其与以下功能相结合。可能是一种更简单的方法,但它对我有用: my_function
      • 我猜colSums(d == "A", na.rm = T) 也很有用,因为 OP 只需要计数而不是特定值的位置。
      猜你喜欢
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多