计算数据框中的元素数量

时间:2018-05-13 17:41:55

标签: r dataset

我有一个这样的数据框:

mydata
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
 [1,] "-"  "-"  "-"  "-"  "+"  "+"  "-"  "-"  "+"  "-"   "0"   "-"   "0"  
 [2,] "-"  "+"  "-"  "+"  "-"  "-"  "-"  "-"  "+"  "+"   "-"   "+"   NA   
 [3,] "+"  

对于每一行,如何根据“ - ”或“+”或“0”计算元素数量?

例如,对于第一行,我们有8个元素用于“ - ”,对于最后一行,我们有:1表示“+”,0表示“ - ”,0表示“0”

我使用table(mydata)但我没有得到预期的结果。实际上,对于最后一行,它只给了我一个“+”(我也希望0代表“ - ”而0代表“0”)

2 个答案:

答案 0 :(得分:2)

您仍然可以使用table使用技巧。

一些示例数据:

set.seed(2)
m <- matrix(sample(c('-','+','0'),size=39,replace=TRUE,prob=c(0.45,0.45,0.1)), nrow=3)
m
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
# [1,] "+"  "+"  "+"  "-"  "-"  "-"  "+"  "+"  "+"  "+"   "+"   "-"   "-"  
# [2,] "-"  "0"  "-"  "-"  "+"  "0"  "+"  "-"  "-"  "0"   "+"   "-"   "+"  
# [3,] "-"  "0"  "-"  "+"  "+"  "+"  "-"  "+"  "+"  "+"   "-"   "-"   "-"  

诀窍是添加所有值,然后从表中减去1:

apply(m, 1, function(a) table(c('-','+','0',a))-1L)
#   [,1] [,2] [,3]
# -    5    6    6
# +    8    4    6
# 0    0    3    1

由于它是转置的,有些人更喜欢它保持行相关:

t(apply(m, 1, function(a) table(c('-','+','0',a))-1))
#      - + 0
# [1,] 5 8 0
# [2,] 6 4 3
# [3,] 6 6 1

注意:当且仅当所有行返回相同大小的对象时,apply才会返回matrix。在这种情况下,由于我们知道所有可能的输入值,然后使用我们的table技巧向我们保证我们将始终拥有长度为3的integer向量。如果还有其他内容,然后它将作为一个参差不齐的list返回。

在特殊情况下,如果您还想知道NA的数量,还需要告诉table将其包含在总数中:

t(apply(m, 1, function(a) table(c('-','+','0',a,NA),useNA='always')-1L))
#      - + 0 <NA>
# [1,] 5 8 0    0
# [2,] 6 4 3    0
# [3,] 6 6 1    0
m[1,2] <- NA
t(apply(m, 1, function(a) table(c('-','+','0',a,NA),useNA='always')-1L))
#      - + 0 <NA>
# [1,] 5 7 0    1
# [2,] 6 4 3    0
# [3,] 6 6 1    0

(添加“已知值”的顺序并不重要,如此处所示。)

答案 1 :(得分:0)

我找到了解决方案。我只需要做(例如第一行):

count(mydata[1,][mydata[1,]=="+"])

给出3

与“ - ”或“0”相同,只需在代码“+”中用“ - ”或“0”重新获得结果