我有一个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
>
答案 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]))