具有表函数的二元运算符的非数字参数

时间:2018-04-25 14:57:49

标签: r

我目前正在尝试对R运行MaxDiff分析。我找到了一个关于如何在R上运行这样的分析的案例研究,我试图在我自己的数据集上使用类似的代码(目前这是一个有限数量的试验观察)。

一切顺利,直到我达到这一点

 #Computing individual-level ranks from counts
set.seed(0) # setting the random number seed to enhance comparability
indidualCountsNoTies = individualCounts + matrix(runif(n * nAlternatives)/100000, n) #adding random numbers to break ties
ranks = nAlternatives + 1 - apply(indidualCountsNoTies,1,rank) #ranks
rankProportions = t(apply(ranks,1,table) / n * 100)
Error in apply(ranks, 1, table)/n : non-numeric argument to binary operator

仅运行

t(apply(ranks,1,table))

我注意到结果实际上不是矩阵,而是这个。我不知道为什么会这样。

     SerCli    Recensioni Spedizione SafePay   EasyBuy   Garanzia  Prezzo   
[1,] Integer,6 Integer,7  Integer,5  Integer,7 Integer,5 Integer,6 Integer,7

这些是我正在采取的所有先前步骤,这些步骤似乎正常

itData = read.spss("C:\\Users\\ricro\\Desktop\\test.sav", use.value.labels = FALSE, to.data.frame = TRUE)
# Selecting the variables containing the max-diff data
z = itData[,-1:-17]
# stacking the data (one set per row)
alternativeNames = c("SerCli","Recensioni","Spedizione","SafePay","EasyBuy","Garanzia","Prezzo")
nAlternatives = length(alternativeNames)
nBlocks = ncol(z) / nAlternatives
nAltsPerSet = 3
n = nrow(z)
nObservations = n * nBlocks 
itMaxDiffData = matrix(as.numeric(t(z)),ncol = nAlternatives,byrow = TRUE, 
dimnames = list(1:nObservations, alternativeNames))

#Computing overall counts
counts = apply(itMaxDiffData, 2, mean, na.rm = TRUE)
ranks = nAlternatives + 1 - rank(counts)
cbind(Counts = counts, Ranks = ranks)

#Computing individual-level counts
id = rep(1:n,rep(nBlocks,n))
individualCounts = aggregate(itMaxDiffData,list(id),mean, na.rm = TRUE)[,-1]
round(individualCounts[1:10,],1) #show data for first 10 respondents

奇怪的是,只有在使用我自己的.sav文件运行代码时才会出现此错误,而使用代码附带的示例数据则不会发生这种情况,即使我手动编辑它的某些部分也是如此。这让我觉得错误可能来自我的SPSS文件的结构,但我真的不确定它。

提前致谢!

编辑:一旦加载到R中并转换为可行的矩阵,这就是我正在使用的数据集

       SerCli Recensioni Spedizione SafePay EasyBuy Garanzia Prezzo
1       1          0         -1      NA      NA       NA     NA
2      -1         NA         NA       1       0       NA     NA
3       0         NA         NA      NA      NA        1     -1
4      NA          0         NA      -1      NA        1     NA
5      NA          1         NA      NA      -1       NA      0
6      NA         NA          1       0      NA       NA     -1
7      -1         NA         NA      NA       1        0     NA
8       1         -1          0      NA      NA       NA     NA
9       0         NA         NA      -1       1       NA     NA
10      0         NA         NA      NA      NA       -1      1
11     NA         -1         NA       0      NA        1     NA
12     NA         -1         NA      NA       1       NA      0
13     NA         NA          1       0      NA       NA     -1
14      0         NA         NA      NA       1       -1     NA
15      0         -1          1      NA      NA       NA     NA
16      0         NA         NA      -1       1       NA     NA
17      0         NA         NA      NA      NA        1     -1
18     NA          1         NA       0      NA       -1     NA
19     NA          0         NA      NA       1       NA     -1
20     NA         NA          1       0      NA       NA     -1
21      0         NA         NA      NA       1       -1     NA
22      1         -1          0      NA      NA       NA     NA
23      1         NA         NA      -1       0       NA     NA
24      1         NA         NA      NA      NA        0     -1
25     NA          1         NA      -1      NA        0     NA
26     NA         -1         NA      NA       0       NA      1
27     NA         NA          1      -1      NA       NA      0
28      1         NA         NA      NA       0       -1     NA
29     -1          1          0      NA      NA       NA     NA
30      0         NA         NA      -1       1       NA     NA
31     -1         NA         NA      NA      NA        0      1
32     NA          1         NA      -1      NA        0     NA
33     NA          0         NA      NA      -1       NA      1
34     NA         NA          0      -1      NA       NA      1
35      0         NA         NA      NA       1       -1     NA
36      1          0         -1      NA      NA       NA     NA
37      0         NA         NA       1      -1       NA     NA
38      1         NA         NA      NA      NA       -1      0
39     NA          0         NA       1      NA       -1     NA
40     NA          1         NA      NA       0       NA     -1
41     NA         NA         -1       1      NA       NA      0
42      1         NA         NA      NA      -1        0     NA
43     -1          1          0      NA      NA       NA     NA
44     -1         NA         NA       0       1       NA     NA
45      0         NA         NA      NA      NA        1     -1
46     NA          1         NA      -1      NA        0     NA
47     NA          0         NA      NA      -1       NA      1
48     NA         NA          1       0      NA       NA     -1
49      1         NA         NA      NA       0       -1     NA
50      1         -1          0      NA      NA       NA     NA
51      0         NA         NA       1      -1       NA     NA
52      0         NA         NA      NA      NA        1     -1
53     NA          1         NA       0      NA       -1     NA
54     NA          1         NA      NA      -1       NA      0
55     NA         NA          1      -1      NA       NA      0
56      1         NA         NA      NA       0       -1     NA
57      0          1         -1      NA      NA       NA     NA
58      0         NA         NA       1      -1       NA     NA
59     -1         NA         NA      NA      NA        1      0
60     NA          1         NA      -1      NA        0     NA
61     NA          1         NA      NA       0       NA     -1
62     NA         NA          0      -1      NA       NA      1
63      1         NA         NA      NA      -1        0     NA
64      0          1         -1      NA      NA       NA     NA
65     -1         NA         NA       1       0       NA     NA
66      0         NA         NA      NA      NA        1     -1
67     NA         -1         NA       1      NA        0     NA
68     NA         -1         NA      NA       0       NA      1
69     NA         NA          0      -1      NA       NA      1
70      1         NA         NA      NA       0       -1     NA
71     -1          1          0      NA      NA       NA     NA
72     -1         NA         NA       0       1       NA     NA
73      1         NA         NA      NA      NA       -1      0
74     NA          0         NA       1      NA       -1     NA
75     NA         -1         NA      NA       0       NA      1
76     NA         NA          1      -1      NA       NA      0
77      1         NA         NA      NA      -1        0     NA
78      0         -1          1      NA      NA       NA     NA
79      0         NA         NA       1      -1       NA     NA
80      1         NA         NA      NA      NA        0     -1
81     NA          0         NA       1      NA       -1     NA
82     NA          1         NA      NA      -1       NA      0
83     NA         NA          1      -1      NA       NA      0
84      1         NA         NA      NA      -1        0     NA
85      0          1         -1      NA      NA       NA     NA
86     -1         NA         NA       1       0       NA     NA
87      0         NA         NA      NA      NA       -1      1
88     NA          1         NA       0      NA       -1     NA
89     NA          1         NA      NA      -1       NA      0
90     NA         NA         -1       1      NA       NA      0
91      0         NA         NA      NA       1       -1     NA
92      1         -1          0      NA      NA       NA     NA
93      0         NA         NA       1      -1       NA     NA
94      1         NA         NA      NA      NA       -1      0
95     NA          1         NA       0      NA       -1     NA
96     NA         -1         NA      NA       0       NA      1
97     NA         NA          1      -1      NA       NA      0
98      1         NA         NA      NA      -1        0     NA

相反,这是我正在尝试执行ranks的{​​{1}}矩阵

apply

编辑#2

好的,我们到了那里。只是一对东西,希望最终解决这个问题。我实际上并没有加载 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] SerCli 6 3 4 1 6 2 5 1 3 5 6 2 5 1 Recensioni 2 7 3 5 2 3 1 3 1 6 5 4 1 5 Spedizione 4 2 2 2 4 7 2 2 6 7 1 1 7 2 SafePay 3 5 6 7 7 1 6 4 5 2 3 3 2 4 EasyBuy 5 1 1 4 3 5 4 7 7 4 4 7 4 7 Garanzia 1 6 5 6 5 6 3 5 2 3 7 6 6 6 Prezzo 7 4 7 3 1 4 7 6 4 1 2 5 3 3 ,我之前将tidyverse定义为n,即数据集中的观察数量。无论如何,这是n <- nrow(z)

的输出
dput(ranks)

1 个答案:

答案 0 :(得分:2)

让我们从问题的顶部开始,您可以说:

  

仅运行

     

t(申请(排名,1,表格))我注意到结果实际上不是a   矩阵,但是这个。我不知道为什么会这样。

     

SerCli Recensioni Spedizione SafePay EasyBuy Garanzia Prezzo

     

[1,]整数,6整数,7整数,5整数,7整数,5   整数,6整数,7

该输出表明您使用了列表元素矩阵而不是数字矩阵。那是因为apply在各行上获得了不同数量的项目,因为它在行序列上循环。 table - 函数返回了不同长度的向量,因此apply无法构建适当的矩阵。

这就是“为什么”。为了建立一个合适的“方法”,我们需要一个可以使用的数据集。

编辑后:

如果您使用dput显示该排名矩阵的内部结构的ASCII版本会更容易,但这是我重建它的方式:

ranks <- matrix( scan(text="6    3    4    1    6    2    5    1    3     5     6     2     5     1
 2    7    3    5    2    3    1    3    1     6     5     4     1     5
 4    2    2    2    4    7    2    2    6     7     1     1     7     2
 3    5    6    7    7    1    6    4    5     2     3     3     2     4
 5    1    1    4    3    5    4    7    7     4     4     7     4     7
 1    6    5    6    5    6    3    5    2     3     7     6     6     6
 7    4    7    3    1    4    7    6    4     1     2     5     3     3"), ncol=14)
nms <- scan(text="SerCli    Recensioni  Spedizione  SafePay     EasyBuy     Garanzia    Prezzo  ",what="")    
#Read 7 items
rownames(ranks) <- nms

然后我看了看:

ranktab = apply(ranks,1,table)
ranktab

与我之前的建议相反的是一个普通的数字矩阵。错误被抛出,因为你没有定义n,我猜你已经加载了tidyverse超级包。它有一个n函数,它不是数字。你可能想要这个,虽然它有点无聊:

rankProportions = t(apply(ranks,1,table) / length(ranks) * 100)
> rankProportions
                  1        2        3        4        5        6        7
SerCli     2.040816 2.040816 2.040816 2.040816 2.040816 2.040816 2.040816
Recensioni 2.040816 2.040816 2.040816 2.040816 2.040816 2.040816 2.040816
Spedizione 2.040816 2.040816 2.040816 2.040816 2.040816 2.040816 2.040816
SafePay    2.040816 2.040816 2.040816 2.040816 2.040816 2.040816 2.040816
EasyBuy    2.040816 2.040816 2.040816 2.040816 2.040816 2.040816 2.040816
Garanzia   2.040816 2.040816 2.040816 2.040816 2.040816 2.040816 2.040816
Prezzo     2.040816 2.040816 2.040816 2.040816 2.040816 2.040816 2.040816

所以现在发布dput(ranks)更为重要,因为您提供的输出并未导致您报告的错误。

提供输出输出后:

所以现在我的原始假设得到了证实,问题是如何获得跨越预定范围的向量值的计数,在这种情况下,值的范围是1:7。制表函数有时是更好的选择,因为它允许您指定箱的数量:

t( apply(ranks2,1,tabulate,  nbins=7 ) )
           [,1] [,2] [,3] [,4] [,5] [,6] [,7]
SerCli        3    2    2    1    3    3    0
Recensioni    3    2    3    1    3    1    1
Spedizione    2    6    0    2    0    1    3
SafePay       1    2    3    2    2    2    2
EasyBuy       2    0    1    5    2    0    4
Garanzia      1    1    2    0    3    6    1
Prezzo        2    1    3    3    1    1    3

....现在你对表比例的计算应该“快速进行”。