0

我有一个名为的列表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(2value.1和 1 来自value.2)正值和 1 个负值,b有 1 个正值和 1+1 负值和一个中性值,并且c有 1 个中性和 1 个负值我不会处理 xy 和 d。

我试图将name.1&value.1,name.2&value.1name.3&value.1列转换为名称匹配的表nameIwant,但我无法加入 3 个不同的表,最后我得到了三个表,第一个有 11 个 nameIwants 并计入所有三种情绪,第二个有 5 个 nameIwants 没有包含在第一个表中,还有一些是,只有消极和积极情绪的情绪得分,我想做的是加入这些表,这样所有的名字都在那里,并且那里的名字在不止一张表中,我想将情绪分数相加,但我不知道该怎么做。

如果我可以用 来做到这一点value.1,那么我也会用 来做同样的事情,然后合并这两个表格,最终得到一个表格,告诉我这些基于和总共有value.2多少反对票、赞成票和中立票。nameIwantsvalue.1value.2

4

1 回答 1

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
于 2013-06-12T02:26:43.623 回答