2012-09-18 152 views
0

我有一大组数据保存在一个长列表中。这是第一个六个记录一个例子:计算R中的频率和项数的比率?

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 

所以,我怎么能计算出每个词出现在记录的数量,即分母,和比自己?

非常感谢您提前考虑!

回答

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 
+0

这正是我一直在寻找!非常感谢你! – user0815

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 
+0

然后,(希望不是说明明显的OP)假设的'输出aggregate'被称为'out', 'out $ rel < - out $ x/table(unlist(B))' – A5C1D2H2I1M1N2O1R2T1

+0

是的,我是“充满希望的”。我在他的A或B上运行他的aggregate()调用时出现错误。 –

+0

此问题是[This one]的精确副本(http://stackoverflow.com/questions/11546941/calculate-relative-frequency-of -list-terms-and-its-sum-in-r)只有一个加法('unique'),但是OP忘记在他们的问题中包含这个。 – A5C1D2H2I1M1N2O1R2T1