Почему к R-таблицам с одним столбцом обращаются иначе, чем к более чем одному? - PullRequest
5 голосов
/ 29 октября 2011

Кажется, что при доступе к таблицам с 1 столбцом действие доступа отбрасывает информацию столбца. Эта информация сохраняется, если имеется более 1 столбца.

* 1003 Е.Г. *

С 1 элементом в таблице:

> example1 <- data.frame( items = c("A","B","B","C","C","C","C")
+                       , time = ISOdate(2222,1,1) )
> table1 <- table(example1)
> table1
     time
items 2222-01-01 12:00:00
    A                   1
    B                   2
    C                   4

> barplot(table1, legend=T)
> table1.ordered <- table1[c(3,2,1),]   # reorder
> table1.ordered
C B A 
4 2 1 
> barplot(table1.ordered, legend=T) # time column thrown away

Теперь с 2 элементами в таблице: (добавлено в пример1 в этом примере)

> example2 <- rbind(example1 , data.frame(items = NA, time = ISOdate(3333,1,1)) )
> example2
  items                time
1     A 2222-01-01 12:00:00
2     B 2222-01-01 12:00:00
3     B 2222-01-01 12:00:00
4     C 2222-01-01 12:00:00
5     C 2222-01-01 12:00:00
6     C 2222-01-01 12:00:00
7     C 2222-01-01 12:00:00
8  <NA> 3333-01-01 12:00:00

> table2 <- table(example2)
> table2
     time
items 2222-01-01 12:00:00 3333-01-01 12:00:00
    A                   1                   0
    B                   2                   0
    C                   4                   0
> table2.ordered <- table2[c(3,2,1),]    #Again, reorder
> table2.ordered
     time
items 2222-01-01 12:00:00 3333-01-01 12:00:00
    C                   4                   0
    B                   2                   0
    A                   1                   0
> barplot(table2.ordered, legend=T)    #displays how I expected

1 Ответ

8 голосов
/ 29 октября 2011

старое значение по умолчанию drop=TRUE проблема ...

Что вы получите при переупорядочении, так это то, что таблица переведена в вектор. Если вы посмотрите на структуру table1, то увидите, что на самом деле это матрица с одним столбцом (счетчиком), а время и элементы являются именами измерений. Это атрибуты, а не часть матрицы.

При переупорядочении также используется значение по умолчанию drop=TRUE из функции [. Таким образом, эта матрица только с одним столбцом переводится в вектор. Впоследствии атрибут имени для столбцов (время) также удаляется.

Вы можете избежать этого:

table1.ordered <- table1[c(3,2,1),,drop=FALSE]   # reorder
table1.ordered

     time
items 2222-01-01 12:00:00
    C                   4
    B                   2
    A                   1

Аргумент drop=TRUE позволяет [функции отбрасывать размеры, равные 1. В этом случае матрица упрощается до вектора. Если вы не хотите, чтобы это произошло, вы должны использовать drop=FALSE. Другой пример:

> X <- matrix(1:4,ncol=2)
> X[,1]
[1] 1 2
> X[,1,drop=FALSE]
     [,1]
[1,]    1
[2,]    2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...