数据分析 - 如何用R统计一列中的多个因子?
问题描述
原始数据如下: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
这个函数?这个问题,还能有更好的解决方式吗?
是这样的,table只能对类似vector
(包括vector
, matrix
,list
)变量起作用。
一维的情形
在一维情况下很容易理解;
> 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
例子一样,所以很容易理解,这不是题主所要的东西,因为:
如果
list
中元素长度不一致,无法做出笛卡尔积,此时,会报错;如果长度一致,做出笛卡尔积,得出的是笛卡尔积的计数,而不是题主想要的每个词语的计数。
比如:
> 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
哦!
这篇关于数据分析 - 如何用R统计一列中的多个因子?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!