R:查找和计数[表合并和求和]

时间:2013-06-12 02:07:13

标签: r

我有一个名为nameIwant的列表,其值为a, b, c

一个看起来像这样的数据框:

   value.1      name.1      name.2     name.3     value.2
  positive      a          b          NA           negative
  negative      x          b          d            neutral
  positive      a          y          NA           positive
  neutral       c          NA         NA           negative

我想要做的是找到每个name.1,name.2和name.3元素匹配nameIwant元素的正数,中性和负数的百分比。

因此,举例来说,我会发现a有2 + 1(来自value.1的2个,value.2中的1个)正值和1个负值,b 1正面和1 + 1负面和一个中立,c有1个中性和1个负面我不会处理xy和d。

我尝试将name.1&value.1name.2&value.1name.3&value.1列转换为表格,其中名称与nameIwant匹配,但我无法加入3个不同的表格,我最后得到了三个表,第一个有11个名字,并且计算了所有三个情绪,第二个有5个名字,没有被包括在第一个表中,还有一些是,并且只有负面和正面情绪的情绪分数,我想要做的是加入这些表,所以所有的名字都在那里,对于多个表中的名字,我想加上情绪分数,但我无法弄清楚如何去做。

如果我可以用value.1做到这一点,那么我会对value.2做同样的事情,然后将这两个表合并成一个表,告诉我有多少负数,根据{{​​1}}和nameIwants,这些value.1总共有正面和中立的投票。

1 个答案:

答案 0 :(得分:1)

如果您使用键列和值列创建一个不错的数据框,生活将变得更加轻松:

dat <- read.table(header=TRUE, text="
value.1      name.1      name.2     name.3     value.2
  positive      a          b          NA           negative
  negative      x          b          d            neutral
  positive      a          y          NA           positive
  neutral       c          NA         NA           negative
", stringsAsFactors=FALSE)

x <- with(dat, data.frame(name=c(name.1, name.2, name.3), value=c(rep(value.1, 3), rep(value.2, 3)), stringsAsFactors=FALSE))

结果:

> x
   name    value
1     a positive
2     x negative
3     a positive
4     c  neutral
5     b positive
6     b negative
7     y positive
8  <NA>  neutral
9  <NA> positive
10    d negative
11 <NA> positive
12 <NA>  neutral
13    a negative
14    x  neutral
15    a positive
16    c negative
17    b negative
18    b  neutral
19    y positive
20 <NA> negative
21 <NA> negative
22    d  neutral
23 <NA> positive
24 <NA> negative

现在你可以使用R机器了:

> table(x)
    value
name negative neutral positive
   a        1       0        3
   b        2       1        1
   c        1       1        0
   d        1       1        0
   x        1       1        0
   y        0       0        2

如果您不喜欢表格中的某些名称,只需丢弃它们即可。要过滤表对象,我建议这个技巧:

tab <- as.data.frame(unclass(table(x)))

过滤

> tab[row.names(tab) %in% c("a", "b", "c"), ]
  negative neutral positive
a        1       0        3
b        2       1        1
c        1       1        0