我有一大堆数据保存在长列表中。这是前六个记录的一个例子:
A <- list(c("JAMES","CHARLES","JAMES","RICHARD"),
c("JOHN","ROBERT","CHARLES"),
c("CHARLES","WILLIAM","CHARLES","MICHAEL","WILLIAM","DAVID","CHARLES","WILLIAM"),
c("CHARLES"),
c("CHARLES","CHARLES"),
c("MATTHEW","CHARLES","JACK"))
我想计算每个记录中每个唯一术语出现的相对频率之和与每个术语出现的记录数之比。
我计算分子,即每个记录中每个唯一术语出现的相对频率之和,如下所示:
> B <- lapply(A, function(x)table(x)/length(x))
> aggregate(unlist(B), list(names(unlist(B))), FUN=sum)
Group.1 x
1 CHARLES 3.2916667
2 DAVID 0.1250000
3 JACK 0.3333333
4 JAMES 0.5000000
5 JOHN 0.3333333
6 MATTHEW 0.3333333
7 MICHAEL 0.1250000
8 RICHARD 0.2500000
9 ROBERT 0.3333333
10 WILLIAM 0.3750000
我不确定如何正确地计算分母,即每个术语出现的记录数。我只知道如何计算数据集中每个术语出现的次数:
> table(unlist(A))
CHARLES DAVID JACK JAMES JOHN MATTHEW MICHAEL RICHARD ROBERT WILLIAM
9 1 1 2 1 1 1 1 1 3
但有些术语在记录中不止一次出现,我想省略这些重复以得到这样的结果:
CHARLES DAVID JACK JAMES JOHN MATTHEW MICHAEL RICHARD ROBERT WILLIAM
6 1 1 1 1 1 1 1 1 1
如何实现这一目标?
根据我的例子,我想获得类似于此的最终输出:
Group.1 x
1 CHARLES 0.5486111
2 DAVID 0.1250000
3 JACK 0.3333333
4 JAMES 0.5000000
5 JOHN 0.3333333
6 MATTHEW 0.3333333
7 MICHAEL 0.1250000
8 RICHARD 0.2500000
9 ROBERT 0.3333333
10 WILLIAM 0.3750000
那么如何计算每个术语出现的记录数,即分母和比率本身?
非常感谢您提前考虑!
答案 0 :(得分:1)
汇总时,只需使用sum
:
mean
aggregate(unlist(B), list(names(unlist(B))), FUN=mean)
# Group.1 x
# 1 CHARLES 0.5486111
# 2 DAVID 0.1250000
# 3 JACK 0.3333333
# 4 JAMES 0.5000000
# 5 JOHN 0.3333333
# 6 MATTHEW 0.3333333
# 7 MICHAEL 0.1250000
# 8 RICHARD 0.2500000
# 9 ROBERT 0.3333333
# 10 WILLIAM 0.3750000
答案 1 :(得分:0)
B <- lapply(A, unique)
B
table(unlist(B))
CHARLES DAVID JACK JAMES JOHN MATTHEW MICHAEL RICHARD ROBERT WILLIAM
6 1 1 1 1 1 1 1 1 1
来自之前的帖子(你真的应该引用user0815)。坚持表格中的独特内容。
BL <- lapply(A, function(x)table(unique(x))/length(x))
## turn list into a vector
B <- unlist(BL)
aggregate(B, list(names(B)), FUN=sum)
#------------
Group.1 x
1 CHARLES 2.5416667
2 DAVID 0.1250000
3 JACK 0.3333333
4 JAMES 0.2500000
5 JOHN 0.3333333
6 MATTHEW 0.3333333
7 MICHAEL 0.1250000
8 RICHARD 0.2500000
9 ROBERT 0.3333333
10 WILLIAM 0.1250000