我正在尝试计算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
答案 0 :(得分: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
答案 1 :(得分:1)
使用mtabulate
(来自@ user3169080&#39;的数据)
library(qdapTools)
d1 <- mtabulate(df1)
is.na(d1) <- d1==0
colMeans(d1, na.rm=TRUE)
# Alice George Mary
# 4.0 3.0 2.5