我有一个这样的数据框:
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”)
答案 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”重新获得结果