Получение строки из фрейма данных как вектора в R - PullRequest
27 голосов
/ 30 сентября 2011

Я знаю, что для получения строки из фрейма данных в R, мы можем сделать это:

data[row,] 

где строка является целым числом. Но это выделяет уродливую структуру данных, где каждый столбец помечен именами имен столбцов. Как мне получить строку в виде списка значений?

Ответы [ 3 ]

27 голосов
/ 01 октября 2011

Data.frames, созданные путем импорта данных из внешнего источника, по умолчанию преобразуют свои данные в факторы.Если вы не хотите этот набор stringsAsFactors=FALSE

В этом случае, чтобы извлечь строку или столбец как вектор, вам нужно сделать что-то вроде этого:

as.numeric(as.vector(DF[1,]))

или вот так

as.character(as.vector(DF[1,]))
13 голосов
/ 01 октября 2011

Вы не можете обязательно получить его как vector, потому что у каждого столбца может быть свой режим.У вас может быть numeric с в одном столбце и character с в следующем.

Если вы знаете режим всей строки или можете преобразовать в тот же тип, вы можете использовать функцию преобразования режима(например, as.numeric()) для преобразования в вектор.Например:

> state.x77[1,]
Population     Income Illiteracy   Life Exp     Murder    HS Grad      Frost 
   3615.00    3624.00       2.10      69.05      15.10      41.30      20.00 
      Area 
  50708.00 
> as.numeric(state.x77[1,])
[1]  3615.00  3624.00     2.10    69.05    15.10    41.30    20.00 50708.00

Это сработает, даже если некоторые столбцы будут integer с, хотя они будут преобразованы в numeric числа с плавающей запятой.

6 голосов
/ 01 октября 2011

Существует проблема с тем, что вы предлагаете; а именно, что компоненты фреймов данных (то, что вы называете столбцами) могут быть разных типов данных. Если вы хотите одну строку в качестве вектора, которая должна содержать только один тип данных - это атомарные векторы!

Вот пример:

> set.seed(2)
> dat <- data.frame(A = 1:10, B = sample(LETTERS[1:4], 10, replace = TRUE))
> dat
    A B
1   1 A
2   2 C
3   3 C
4   4 A
5   5 D
6   6 D
7   7 A
8   8 D
9   9 B
10 10 C
> dat[1, ]
  A B
1 1 A

Если мы заставим его удалить пустой столбец (столбец), единственным выходом для R будет преобразование строки в список для поддержки разнородных типов данных.

> dat[1, , drop = TRUE]
$A
[1] 1

$B
[1] A
Levels: A B C D

Единственное логическое решение для этого - привести фрейм данных в общий тип, приведя его к матрице. Это делается через data.matrix() например:

> mat <- data.matrix(dat)
> mat[1,]
A B 
1 1

data.matrix() преобразует коэффициенты в их внутренние числовые коды. Вышесказанное позволяет извлечь первую строку как вектор.

Однако, если у вас есть символьные данные во фрейме данных, единственным выходом будет создание матрицы символов, которая может или не может быть полезной, и data.matrix() теперь нельзя использовать, нам нужно as.matrix() вместо:

> dat$String <- LETTERS[1:10]
> str(dat)
'data.frame':   10 obs. of  3 variables:
 $ A     : int  1 2 3 4 5 6 7 8 9 10
 $ B     : Factor w/ 4 levels "A","B","C","D": 1 3 3 1 4 4 1 4 2 3
 $ String: chr  "A" "B" "C" "D" ...
> mat <- data.matrix(dat)
Warning message:
NAs introduced by coercion 
> mat
       A B String
 [1,]  1 1     NA
 [2,]  2 3     NA
 [3,]  3 3     NA
 [4,]  4 1     NA
 [5,]  5 4     NA
 [6,]  6 4     NA
 [7,]  7 1     NA
 [8,]  8 4     NA
 [9,]  9 2     NA
[10,] 10 3     NA
> mat <- as.matrix(dat)
> mat
      A    B   String
 [1,] " 1" "A" "A"   
 [2,] " 2" "C" "B"   
 [3,] " 3" "C" "C"   
 [4,] " 4" "A" "D"   
 [5,] " 5" "D" "E"   
 [6,] " 6" "D" "F"   
 [7,] " 7" "A" "G"   
 [8,] " 8" "D" "H"   
 [9,] " 9" "B" "I"   
[10,] "10" "C" "J"
> mat[1, ]
     A      B String 
  " 1"    "A"    "A" 
> class(mat[1, ])
[1] "character"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...