如何用R统计一列中的多个因子?

发布于 2022-09-03 01:11:51 字数 408 浏览 16 评论 0

  1. 原始数据如下:wl.csv,每一行是一篇论文,每个论文有1~3个关键词,要统计每个关键词的词频。

1 keywords <- wltext$E关键词
2 keywords <- as.character(keywords)
3 list_ke <- strsplit(keywords,";")
4 table(unlist(list_ke))

这是我的做法,有个地方不明白,list_ke是list的形式,使用table函数为什么要用unlist这个函数?这个问题,还能有更好的解决方式吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青衫儰鉨ミ守葔 2022-09-10 01:11:51

是这样的,table只能对类似vector(包括vectormatrixlist)变量起作用。

一维的情形

在一维情况下很容易理解;

> a <- c("a", "a", "b")
> table(a)
a
a b 
2 1 

就是将a里的因子变量计数,输出成一个一维的vector

二维的情形

在二维以上的情形是比较复杂的。

> a <- matrix(c("a", "a", "b", "b", "c","c", "d",'d'), ncol=2)
> a
     [,1] [,2]
[1,] "a"  "c" 
[2,] "a"  "c" 
[3,] "b"  "d" 
[4,] "b"  "d" 
> table(a)
a
a b c d 
2 2 2 2 
> b <- as.data.frame(a)
> b
  V1 V2
1  a  c
2  a  c
3  b  d
4  b  d
> table(b)
   V2
V1  c d
  a 2 0
  b 0 2
> a <- matrix(c("a", "a", "b", "b", "c","c", "d",'e'), ncol=2)
> table(a)
a
a b c d e 
2 2 2 1 1 
> a <- matrix(c("a", "a", "b", "b", "c","c", "d",'e'), ncol=2)
> a
     [,1] [,2]
[1,] "a"  "c" 
[2,] "a"  "c" 
[3,] "b"  "d" 
[4,] "b"  "e" 
> table(a)
a
a b c d e 
2 2 2 1 1 
> b <- as.data.frame(a)
> b
  V1 V2
1  a  c
2  a  c
3  b  d
4  b  e
> table(b)
   V2
V1  c d e
  a 2 0 0
  b 0 1 1

在为matrix时,是对matrix向量化后,转为vector解。
在为data.frame时,实际是是对于两个变量的笛卡尔积做table,比如上面的例子,其实是对于

('a', 'c'), ('a', 'c'), ('b', 'd'), ('b', 'e')这四个变量做table,结果输出为matrix形式(类似于数据分析中的透视表)。

我们再来看list的例子

> c <- list(c("a", "a", 'b', 'b'), c('c', 'c', 'd', 'e'))
> c
[[1]]
[1] "a" "a" "b" "b"

[[2]]
[1] "c" "c" "d" "e"

> table(c)
   c.2
c.1 c d e
  a 2 0 0
  b 0 1 1

上面例子可以看出,对list操作其实就是对list中每个元素进行笛卡尔积后,做table,输出为矩阵,和对data.frame的操作类似。

回过头来看题主的问题

题主在strsplit后实际得出的是一个list,和上面二维情况下的list例子一样,所以很容易理解,这不是题主所要的东西,因为:

  1. 如果list中元素长度不一致,无法做出笛卡尔积,此时,会报错;

  2. 如果长度一致,做出笛卡尔积,得出的是笛卡尔积的计数,而不是题主想要的每个词语的计数。

比如:

> text <- c("关键词1;关键词2;", "关键词1;关键词3")
> test_list <- strsplit(text, ";")
> test_list
[[1]]
[1] "关键词1" "关键词2"

[[2]]
[1] "关键词1" "关键词3"

> table(test_list)
           test_list.2
test_list.1 关键词1 关键词3
    关键词1       1       0
    关键词2       0       1

它实际上是对((关键词1, 关键词2),(关键词1, 关键词2))做table,
而不是对(关键词1, 关键词2,关键词1, 关键词2)做table

因此,要unlist哦!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文