如何将数据框中的列制成表格并将结果放在单个数据框中

时间:2017-02-06 15:04:15

标签: r aggregate apply

我有一个400行和1200列的数据框,一般结构如下:

> df=data.frame(Col1=paste0('row',1:15),metric1=sample(c('H','M','L'),15,replace = 1),metric2=sample(c('H','M'),15,replace = 1))
> df
    Col1 metric1 metric2 ...
1   row1       M       H
2   row2       H       L

我想要做的是根据每列的HML计数比较每行的表格结果。

我试过

> apply(df[,2:3],2,function(x) table(x))
$metric1
x
H L M 
1 7 7 

$metric2
x
 H  M 
10  5 

> 

但结果是1200的列表,因为并非所有列都包含所有3个值,即一列只有HL,而另一列有HML。

我也试过聚合,导致错误

> apply(df[,2:3],2,function(x) aggregate(df$count,list(df[,x]),sum))
Error in `[.data.frame`(df, , x) : undefined columns selected

但我的功能有效:

> aggregate(df$count,list(df[,2]),sum)
  Group.1 x
1       H 1
2       L 7
3       M 7
> 

我希望将其保存为数据框,例如:

> data.frame(var=c('H','M','L'),metric1=c(100,100,200),metric2=c(250,150,0))
  var metric1 metric2
1   H     100     250
2   M     100     150
3   L     200       0
> 

3 个答案:

答案 0 :(得分:2)

我会确保所有table导致3个类别,首先将指标转换为具有H,L,M作为级别的因子。

这导致:

df=data.frame(Col1=paste0('row',1:15),metric1=sample(c('H','M','L'),15,replace = 1),metric2=sample(c('H','M'),15,replace = 1))
for (i in 2:ncol(df)){
  df[[i]] <- factor(df[[i]],levels=c("H","M","L"))
}

然后在每个列和堆栈上调用apply表:

sapply(df[-1],table)
      metric1 metric2
H       3       8
M       1       7
L      11       0

答案 1 :(得分:2)

或者,如果您不想使用循环,您还可以在表格函数中指定级别:

apply(df[,2:3],2,function(x) table(factor(x,levels=c("H","M","L"))))

    metric1 metric2
H       6      11
M       8       4
L       1       0

答案 2 :(得分:0)

或者,您可以执行以下操作:

sumer <- function(data, pattern)
{
        temp <- colSums(sapply(pattern, grepl, data))
        names(temp) <- pattern
        temp
}


apply(df[, 2:3], 2, sumer, unique(df[, 2]))