如何合并向量和计算每列的因子出现次数

时间:2015-04-26 15:34:34

标签: r

我试图将多个字符列表(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

我该如何开始? 谢谢!

1 个答案:

答案 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:将名为list1list2等所有对象收集到一个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))))