0

我认为我的问题与这个问题有些相似。cbind 正在更改我正在使用的向量的值(或使用对值的引用)我基本上是从数据框中获取数据,然后根据某个因素(接口类型)将它们组织成列。我认为这与那里的水平有关,但我不确定这些现在意味着什么。这是我正在做的事情以及我得到的结果:

#Grouping subjects number of collisions data according to the interface they used
> ui1NumCollisions = dout$numCollisions[ dout$Interface=="0"]
> ui2NumCollisions = dout$numCollisions[ dout$Interface=="1"]
> ui3NumCollisions = dout$numCollisions[ dout$Interface=="2"]
> ui4NumCollisions = dout$numCollisions[ dout$Interface=="3"]
#checking data
> ui1NumCollisions
 [1] 43,  30,  37,  6,   22,  9,   19,  9,   14,  106, 50,  53, 
33 Levels: -1, 10, 106, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 21, 22, ... 9,
> ui2NumCollisions
 [1] 17, 16, 23, 12, 15, -1, 11, 26, 19, 32, 36, 13,
33 Levels: -1, 10, 106, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 21, 22, ... 9,
> ui3NumCollisions
 [1] 17, 38, 16, 13, 42, 50, 10, 17, 2,  28, 14, 30,
33 Levels: -1, 10, 106, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 21, 22, ... 9,
> ui4NumCollisions
 [1] 42, 28, 22, 36, 10, 25, 45, 48, 18, 11, 21, 7, 
33 Levels: -1, 10, 106, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 21, 22, ... 9,
#Creates matrix with each column containing collision data for each interface
#(I think)
> uiNumCollisions = cbind( '1' = ui1NumCollisions
+                        , '2' = ui2NumCollisions
+                        , '3' = ui3NumCollisions
+                        , '4' = ui4NumCollisions)
#checking matrix values
> uiNumCollisions
       1  2  3  4
 [1,] 26 10 10 25
 [2,] 20  9 24 19
 [3,] 23 16  9 15
 [4,] 31  5  6 22
 [5,] 15  8 25  2
 [6,] 33  1 29 17
 [7,] 12  4  2 27
 [8,] 33 18 10 28
 [9,]  7 12 13 11
[10,]  3 21 19  4
[11,] 29 22  7 14
[12,] 30  6 20 32
> uiNumCollisionsSummary = summary(uiNumCollisions)
> uiNumCollisionsSummary
       1               2               3              4        
 Min.   : 3.00   Min.   : 1.00   Min.   : 2.0   Min.   : 2.00  
 1st Qu.:14.25   1st Qu.: 5.75   1st Qu.: 8.5   1st Qu.:13.25  
 Median :24.50   Median : 9.50   Median :11.5   Median :18.00  
 Mean   :21.83   Mean   :11.00   Mean   :14.5   Mean   :18.00  
 3rd Qu.:30.25   3rd Qu.:16.50   3rd Qu.:21.0   3rd Qu.:25.50  
 Max.   :33.00   Max.   :22.00   Max.   :29.0   Max.   :32.00 

请注意,106 不是第 1 列的一部分,也不是那里的最大值,而是 33。那么,为什么 uiNumCollisions 中的值与各个列(ui1NumCollisions、ui2NumCollisions 等)不同?似乎我正在从级别表中获取值的索引。我真正想要的是价值观本身。我假设这应该有一个简单的答案。我查看了一堆与数据绑定相关的问题,但无法使用我发现的内容找到解决此问题的方法。我在这里想念什么?

我提前感谢您的帮助。真挚地,

保罗。

/-------FOLLOW - UP 基于 DWin 的回复-------

谢谢回复。将 data.frame 应用于 uiNumCollisions 的解决方案可以在其中获取正确的数据。但是,当我应用摘要功能时:

uiNumCollisionsSummary = summary(uiNumCollisions)

我不再得到以前的统计数据(平均值、中位数等)。这是为什么?

此外,在那之后,我想将箱线图应用于 uiNumCollisions 和方差分析。对于箱线图,我使用的是以下内容:

par( fig=c(0.0,1.0,0.0,1.0))
temp = boxplot( uiNumCollisions)

我得到的箱线图结果是

"Error in oldClass(stats) <- cl :  adding class "factor" to an invalid object"

对于方差分析,我使用了以下代码:

temp = c(ui1NumCollisions, ui2NumCollisions, ui3NumCollisions, ui4NumCollisions)
temp.type = rep(c("1", "2", "3", "4"), c(12,12,12,12))
temp.type = factor(temp.type)
options(contrasts = c("contr.helmert", "contr.poly"))
uiNumCollisionsAOV = aov(temp ~ temp.type)
summary(uiNumCollisionsAOV)

但是,除非我将每一列转换为其他内容,否则这显然不起作用。我尝试了不同的修复,比如将因子重新应用到每一列(例如:ui1NumCollisions = factor(ui1NumCollisions))。这固定了因子水平,但是当我使用类似的东西转换回数值时as.numeric(levels(ui1NumCollisions)[ui1NumCollisions]),我只得到了 NA。因此,确实,你的解决方案有效,我真的很感激,但它并不能完全解决我的问题。有什么简单的方法吗?也许只是简单地导入 dout 表,我可以在没有可以解决我遇到的所有因素问题的因素的情况下获取所有数据?

/-------跟进 - 向上 #2--------

我终于找到了问题所在。数据之间有逗号,而不是简单的空格。文件 data.out 如下所示:

Subject, uiType, numCollisions, startTimeTraining, startTime, endTime, detlaTraining, deltaTask
0, 0, 43, 0, 510.261, 1743.75, 510.261, 1233.49
1, 1, 17, 0, 1198.65, 2044.62, 1198.65, 845.965
2, 2, 17, 0, 445.788, 1622.83, 445.788, 1177.04
3, 3, 42, 0, 254.793, 1196.93, 254.793, 942.132
4, 1, 16, 0, 1583.5, 2887.39, 1583.5, 1303.9
5, 2, 38, 0, 79.095, 886.533, 79.095, 1287.438
6, 3, 28, 0, 866.75, 1617.48, 866.75, 750.73
7, 1, 23, 0, 565.575, 1361.79, 565.575, 796.216
8, 2, 16, 0, 1211.99, 2538.37, 1211.99, 1326.38
...

它应该看起来像这样。

Subject uiType numCollisions startTimeTraining startTime endTime detlaTraining deltaTask
0 0 43 0 510.261 1743.75 510.261 1233.49
1 1 17 0 1198.65 2044.62 1198.65 845.965
2 2 17 0 445.788 1622.83 445.788 1177.04
3 3 42 0 254.793 1196.93 254.793 942.132
4 1 16 0 1583.5 2887.39 1583.5 1303.9
5 2 38 0 79.095 886.533 79.095 1287.438
6 3 28 0 866.75 1617.48 866.75 750.73
7 1 23 0 565.575 1361.79 565.575 796.216
8 2 16 0 1211.99 2538.37 1211.99 1326.38
...

当我使用这些行加载数据表时:

numSamples = 8#or more
dout = read.table("data.out", header = TRUE)
dout = dout[1:numSamples,]
dout

我会得到一个奇怪的表格,里面填满了附加到逗号的整数,这搞砸了我的数据转换为数字并给了我这些因素。

在我修复它之后,原始代码就像一个魅力。

我感谢 DWin 提供的帮助以及在此处发布此问题的机会,尽管这是我的一个相当愚蠢的错误。

经验教训:醒来后而不是睡前仔细检查您的数据。

谢谢,

保罗。

4

1 回答 1

0

因为您将这些因子列提取为向量,所以它们丢失了“data.frame”类。所以它并没有改变标签,而是完全失去了 htem。当您使用 cbind 时,结果是一个矩阵。矩阵会丢失任何因子属性。因子标签在属性中。所以矩阵的内容变成了因子索引而不是因子标签。如果您不使用该功能,而是cbind使用该data.frame功能,您的标签将保持不变。不过,您可能不希望列名是数字。

uiNumCollisions = data.frame( one = ui1NumCollisions
                    , two = ui2NumCollisions
                    , three = ui3NumCollisions
                    , four = ui4NumCollisions)

如果您查看以下内容可能会有所帮助:

str(ui1NumCollisions)
attributes(ui1NumCollisions)

策略 2:您可以将 NumCollisions 提取保留为 data.frames:

 ui1NumCollisions = dout[ dout$Interface=="0", "numCollisions", 
                                              drop=FALSE]

然后你会cbind.data.frame在你打电话时使用(在幕后)cbind

于 2013-06-18T05:15:11.053 回答