我试图将多个字符列表(A,B,C,D,E)合并到数据框或矩阵中。它们都具有相同数量的元素 - 20.它们看起来像这样:
> line1
[1] B C C D A B D E C A B E B A D E C C A B
Levels: A B C D E
> typeof(line1)
[1] "integer"
> line2
[1] B E E A C E D B B D C C A A E E A A E B
Levels: A B C D E
> typeof(line2)
[1] "integer"
> (...)
> line10
[1] B E E A C E D B B C D C A A E E C A E B
Levels: A B C D E
这样做的目的是计算所有对象(第1行)中每列的出现次数。让我们说n = 10.所以输出应该是这样的(基于上面的例子):
A B C D E
1: 0 3 0 0 0
2: 0 0 1 0 2
3: 0 0 1 0 2
(...)
20: 0 3 0 0 0
我该如何开始? 谢谢!
答案 0 :(得分:3)
你基本上要求table
:
table(
cbind(
id = 1:20, ## index of position of vector element
stack(
lapply(mget(ls(pattern = "line\\d+")), ## collect all "line" vecs in a list
as.character)))[c("id", "values")]) ## stack doesn't work with factors
# values
# id A B C D E
# 1 0 3 0 0 0
# 2 0 0 1 0 2
# 3 0 0 1 0 2
# 4 2 0 0 1 0
# 5 1 0 2 0 0
# 6 0 1 0 0 2
# 7 0 0 0 3 0
# 8 0 2 0 0 1
# 9 0 2 1 0 0
# 10 1 0 1 1 0
# 11 0 1 1 1 0
# 12 0 0 2 0 1
# 13 2 1 0 0 0
# 14 3 0 0 0 0
# 15 0 0 0 1 2
# 16 0 0 0 0 3
# 17 1 0 2 0 0
# 18 2 0 1 0 0
# 19 1 0 0 0 2
# 20 0 3 0 0 0
以上是做什么的:
mget
:将名为list1
,list2
等所有对象收集到一个list
中。lapply(., as.character)
:将factor
转换为character
,因为stack
不喜欢factor
s。stack
:创建data.frame
的两列list
版本,其中值存储在名为“values”的列中,相关列表名称称为“ind”。不需要第二列。cbind(id = 1:20, .)
:添加一个“id”列,表示向量中值的位置(从1到20)。值1到20被回收。table(.[c("id", "values")])
:仅列出“id”和“values”列中的值。您还可以执行以下操作:
t(Reduce("+", lapply(mget(ls(pattern = "line\\d+")), function(x) sapply(x, table))))