R中的cbind - 放置值,获得级别索引

时间:2013-06-17 23:08:04

标签: r cbind

我认为我的问题与此问题有些类似。 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等)不同?好像我从级别表中获取值的索引。我真正想要的是价值观本身。我应该有一个简单的答案。我查看了一堆与数据绑定相关的问题,但无法使用我发现的问题找出解决这个问题的方法。我在这里缺少什么?

我提前感谢你的帮助。 此致

圣保罗。

/ -------关注 - 根据DWin -------

的回复

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

uiNumCollisionsSummary = summary(uiNumCollisions)

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

此外,在此之后,我想将一个箱线图应用于uiNumCollisions和一个anova。对于箱线图,我使用的是以下内容:

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"

对于ANOVA,我使用以下代码:

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])的东西转换回数值时,我只有NAs。因此,确实,你的解决方案有效,我真的很感激它,但它并没有完全解决我的问题。是否有一个简单的方法?也许只是简单地导入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的帮助,并有机会在这里发布这个问题,尽管这是我的一个相当愚蠢的错误。

获得的经验:在您醒来之后,而不是在睡觉前仔细检查您的数据。

谢谢,

圣保罗。

1 个答案:

答案 0 :(得分:0)

因为您将这些因子列提取为向量,所以它们丢失了'data.frame'类。所以它并没有那么多改变标签,因为它完全失去了它。当你使用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(在幕后)