Получение строки из фрейма данных в виде вектора в R
Я знаю, что для получения строки из кадра данных в R мы можем сделать это:
data[row,]
где row - целое число. Но это вырывает уродливую структуру данных, где каждый столбец помечен именами имен столбцов. Как я могу просто получить его как список значений?
Ответы
Ответ 1
Data.frames, созданные путем импорта данных из внешнего источника, по умолчанию преобразуют данные в факторы. Если вы не хотите, чтобы этот набор stringsAsFactors=FALSE
В этом случае для извлечения строки или столбца в качестве вектора вам нужно сделать что-то вроде этого:
as.numeric(as.vector(DF[1,]))
или как это
as.character(as.vector(DF[1,]))
Ответ 2
Вы не можете получить его как 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
s, хотя они были бы преобразованы в числа numeric
с плавающей запятой.
Ответ 3
Существует проблема с тем, что вы предлагаете; а именно, что компоненты кадров данных (то, что вы называете столбцами) могут иметь разные типы данных. Если вам нужна одна строка в качестве вектора, которая должна содержать только один тип данных - они являются атомными векторами!
Вот пример:
> 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"