2

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

4

2 回答 2

6

您可以将函数应用于 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')))
于 2013-11-30T22:02:39.180 回答
0

与@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 替换为标识您正在计数的内容。

于 2013-11-30T22:28:23.080 回答