【问题标题】:cbind in R - putting values, getting level indicesR中的cbind - 输入值,获取级别索引
【发布时间】:2013-06-17 23:08:03
【问题描述】:

我认为我的问题与这个问题有些相似。 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 表,而不需要可以解决我遇到的所有因素问题的因素?

/-------跟进 - UP #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 提供的帮助以及在此处发布此问题的机会,尽管这是我的一个相当愚蠢的错误。

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

谢谢,

保罗。

【问题讨论】:

    标签: r cbind


    【解决方案1】:

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

    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 时,您将使用cbind.data.frame(在幕后)

    【讨论】:

    • 感谢您的回复,请参阅上面的更新。顺便说一句,最后一个选项(ui1NumCollisions = dout$numCollisions[dout$Interface=="0", "numCollisions", drop=FALSE])给了我太多维度错误,我猜是因为括号中的第三个参数.
    • 对。 (没有提供用于测试的数据,所以你得到你所支付的。)应该是ui1NumCollisions = dout[ dout$Interface=="0", "numCollisions", drop=FALSE]
    • 嗨,DWin,哎呀,我没有注意到这个严重的错误。你是对的,我应该为没有提供数据文件而道歉。事实证明,数据文件确实是问题所在。我假设空格分隔我的数据,而事实上,它是逗号。这导致逗号作为每个数据的一部分添加,因此数字转换永远不会正确发生。当您在半睡半醒的情况下为同一件事工作太多时间时会发生这种错误。我非常感谢您的帮助 DWin。它让我对 R 的工作原理有了很多了解。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2016-05-07
    • 2021-06-10
    • 2016-11-28
    相关资源
    最近更新 更多