0

我正在尝试计算 data.frame 中多列的频率。

table在每一列上使用了该函数并通过 cbind 将它们全部绑定,然后将使用聚合函数通过我的标识符计算平均值。例子:

df1
V1       V2     V3
George   Mary   Mary  
George   Mary   Mary
George   Mary   George
Mary     Mary   George
Mary    George  George
Mary   
Frequency<- as.data.frame(cbind(table(df1$V1), table(df1$V2), table(df1$V3)))
row.names V1
George    3
Mary      3
          1
George    1
Mary      4
          1
George    3
Mary      2

我得到的结果(视觉上)是一个 2 列数据框,但是当我检查 的维度时Frequency,我得到的结果暗示仅存在第二列。

当我尝试重命名列并运行聚合函数时,这给我带来了麻烦,重命名时出现错误:

colnames(Frequency) <- c("Name", "Frequency")
Error in names(Frequency) <- c("Name", "Frequency") : 
  'names' attribute [2] must be the same length as the vector [1]

最终目的是运行聚合命令并按名称获取平均值:

Name.Mean<- aggregate(Frequency$Frequency, list(Frequency.Name), mean)

期望的输出:

Name   Mean
George Value
Mary   Value
4

2 回答 2

1

我希望这就是你要找的:

> df1
  V1     V2     V3
1 George George George
2   Mary   Mary  Alice
3 George George George
4   Mary   Mary  Alice
5   <NA> George George
6   <NA>   Mary  Alice
7   <NA>   <NA> George
8   <NA>   <NA>  Alice
> ll=unlist(lapply(df1,table))
> nn=names(ll)
> nn1=sapply(nn,function(x) substr(x,4,nchar(x)))
> mm=data.frame(ll)
> mm$names=nn1
> tapply(mm$ll,mm$names,mean)
> Mean=tapply(mm$ll,mm$names,mean)
> data.frame(Mean)
       Mean
Alice   4.0
George  3.0
Mary    2.5
于 2015-06-16T13:51:45.247 回答
1

使用mtabulate(来自@user3169080 帖子的数据)

library(qdapTools)
d1 <- mtabulate(df1)
is.na(d1) <- d1==0 
colMeans(d1, na.rm=TRUE)
# Alice George   Mary 
#  4.0    3.0    2.5 
于 2015-06-16T14:55:38.873 回答