订单功能问题 - 选择未定义的列

时间:2014-07-22 17:34:20

标签: r

我使用summaryBy函数创建了一个data.frame - y< - summaryBy ....

在运行订单功能进行排序时,我收到错误。感谢帮助!

> str(y)
'data.frame':   77 obs. of  8 variables:
 $ a           : Factor w/ 66 levels ...
 $ b: Factor w/ 16 levels ...
 $ totalPaid.m                     : num  NA NA NA NA NA ...
 $ totalPaid.s                     : num  NA NA NA NA NA ...
 $ totalPaid.c                     : num  1357 1 1 1 1 ...
 $ c.m                             : num  NA 0 1.17 0 21.43 ...
 $ c.s                             : num  NA NA NA NA NA ...
 $ c.c                             : num  1357 1 1 1 1 ...

> order(y$totalPaid.m)
 [1] 66 68 21 24 12 71 51 60 46 39 74 76  9 44 63 77 26 75 58 73 47 57 65 30 11 72 42 15 18 70 48 27 35 16 32 61 29 43 55 33 40 59 23 13 67 56 31 19 45 50 25 38 52 62 37 36 10 14
[59] 22 69 28 49 54 53 64  1  2  3  4  5  6  7  8 17 20 34 41

> y[order(y$totalPaid.m)]
Error in `[.data.frame`(y, order(y$totalPaid.m)) : 
  undefined columns selected

1 个答案:

答案 0 :(得分:5)

正如Henrik在你想要的评论中所说的那样

y[order(y$totalPaid.m), ]

R数据帧可以由列和行索引。您可以通过放置逗号来指定是按列还是按行编制索引。以下是一些例子:

a <- rnorm(10,10,1000)
b <- rnorm(10,-10,10)
c <- rnorm(10,100,5)
dat <- data.frame(a,b,c)
dat
              a           b         c
 1     18.88251   4.1280241 100.61576
 2    716.73542  -2.2301466  97.93047
 3  -1235.55314 -11.5865178  98.20612
 4   -320.97346  -2.0478518 105.74852
 5    862.63454 -14.6095826  97.58298
 6    361.91272  -0.9127309  91.44080
 7   -616.91762  -9.0358181  98.78145
 8   -411.13981 -22.6804911  95.42187
 9    299.97119 -14.4090133  97.60401
 10  -966.91953 -15.3730726 100.68891

您可能已经猜到dat[1, 1]将向左上角的单元格显示,dat[10, 3]将为您提供右下方的单元格,dat[5, 2]将为您提供中心单元格。

 dat[1, 1]
 # [1] 18.88251

 dat[10, 3]
 # [1] 100.6889

 dat[5, 2]
 # [1] -14.60958

您还可以通过将其中一个位置留空来选择data.frame的整个行或列。例如,dat[, 1]为您提供data.frame的第一列,而dat[1, ]为您提供第一行。

dat[ ,1]
#  [1]    18.88251   716.73542 -1235.55314  -320.97346   862.63454   361.91272
#  [7]  -616.91762  -411.13981   299.97119  -966.91953

dat[1, ]
#          a        b        c
# 1 18.88251 4.128024 100.6158

当您将基于行或列操作的函数应用于data.frame时,指定您选择列或行(由逗号的位置指示)非常重要。

min(dat[,1])
# [1] -1235.553

min(dat[1,])
# [1] 4.128024

你想要的原因

y[order(y$totalPaid.m), ]

而不是

y[, order(y$totalPaid.m)]

order(dat$col)按从最大到最小的顺序为您提供行索引(数字)。例如:

order(dat$b)
# [1]  8 10  5  9  3  7  2  4  6  1

这意味着您的数据框将根据订单函数给出的行索引进行重新排序。 order函数对您作为参数赋予函数的列进行操作。

我希望这有助于你理解。