0

我有一大堆数据保存在一个长列表中。这是前六个记录的示例:

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  

那么如何计算每个术语出现的记录数,即分母和比率本身?

非常感谢您的考虑!

4

2 回答 2

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
于 2012-09-18T16:45:20.833 回答
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
于 2012-09-18T16:07:32.133 回答