Преобразование строки фрейма данных в вектор

116

Я хочу создать вектор из строки фрейма данных. Но мне не нужны имена строк и столбцов. Я пробовал несколько вещей ... но безуспешно.

Это мой фрейм данных:

> df <- data.frame(a=c(1,2,4,2),b=c(2,6,2,1),c=c(2.6,8.2,7.5,3))
> df
  a b   c
1 1 2 2.6
2 2 6 8.2
3 4 2 7.5
4 2 1 3.0

Я попытался:

> newV <- as.vector(df[1,])
> newV
  a b   c
1 1 2 2.6

Но мне очень нужно что-то вроде этого:

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6
Джоко
источник
Я предлагаю вам правильно отформатировать данные, которые вы показали. Похоже, вам не хватает разрыва строки.
Чинмей Патил
Я хочу скандал. Строка «1», а не столбец «А».
Джоко
Есть ли способ применить это ко всем строкам кадра данных и тем самым объединить все векторы в один вектор?
stephanmg
1
@stephanmg: Что о чем - то вроде: c(t(as.matrix(df)))?
Андри Синьорелл
Андри: Это работает, хотя я мог бы решить и по-другому.
Stephanmg

Ответы:

154

Когда вы извлекаете одну строку из фрейма данных, вы получаете однорядный фрейм данных. Преобразуйте его в числовой вектор:

as.numeric(df[1,])

Как предлагает @Roland, unlist(df[1,])преобразует однострочный фрейм данных в числовой вектор, не удаляя имена. Следовательно, unname(unlist(df[1,]))это еще один, немного более явный способ получить тот же результат.

Как комментирует @Josh ниже, если у вас есть не полностью числовой (буквенный, факторный, смешанный ...) фрейм данных, вам нужен as.character(df[1,])вместо этого.

Бен Болкер
источник
это может быть +1 (или 0 голосов против) ОП за предоставление кода, который четко иллюстрирует то, что они хотят, даже несмотря на то, что текст и заголовок вопроса были искажены ...
Бен Болкер
@ChinmayPatil, каковы еще их варианты? Их пример кода определенно делает вид, что они хотят именно этого.
Бен Болкер
2
Следует отметить, что фрейм данных уже является вектором и, следовательно, as.vector видит, что это вектор режима «список» и ничего не делает. Чтобы облегчить понимание основных механизмов, попробуйте as.vector (df [1,], mode = "numeric"), что является более наглядным. Это то, что делает as.numeric.
1
без проблем. Я только констатирую, что на эту проблему они дают точно такой же ответ.
Бен Болкер 01
1
Тем временем, возможно, были изменены, но сегодня unlist позволяет удалять имена: identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (и, кстати, df все еще не подходящее имя для data.frame ... ;-))
Андри Синьорелл
45

Рекомендую unlist, что сохраняет имена.

unlist(df[1,])
  a   b   c 
1.0 2.0 2.6 

is.vector(unlist(df[1,]))
[1] TRUE

Если вам не нужен именованный вектор:

unname(unlist(df[1,]))
[1] 1.0 2.0 2.6
Роланд
источник
7

Если вы не хотите переходить на числовой, вы можете попробовать это.

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6
Чинмай Патил
источник
3
для меня это не имеет особого смысла: str(as.vector(t(df)[,1]))есть num [1:3] 1 2 2.6, т.е. ваш код действительно преобразует результаты в числовой вектор ...
Бен Болкер
2
в частности, когда вы используете t(df)R, переводит фрейм данных в матрицу, в данном случае числовую матрицу, потому что все элементы являются числовыми. Затем [,1]извлекается первый столбец (числовой вектор, поскольку избыточное измерение автоматически удаляется). as.vector()просто отбрасывает имена (с которыми вы тоже можете поступить unname()).
Бен Болкер
Кажется, это работает и для персонажей. Но насчет принуждения вы правы. FWIW, мое решение будет работать и с фреймами символьных данных ... с оговоркой, что все данные будут преобразованы в символьные
Чинмей Патил
2
Я бы сказал, что unname(unlist(x))решение немного лучше (более эффективное и прозрачное).
Бен Болкер
as.vector(t(df)[,1])Я люблю это ! Именно то, что мне нужно!
Утер Пендрагон
7

Вот dplyrвариант на основе:

newV = df %>% slice(1) %>% unlist(use.names = FALSE)

# or slightly different:
newV = df %>% slice(1) %>% unlist() %>% unname()
sbha
источник
2

Обратите внимание, что вы должны быть осторожны, если ваша строка содержит фактор. Вот пример:

df_1 = data.frame(V1 = factor(11:15),
                  V2 = 21:25)
df_1[1,] %>% as.numeric() # you expect 11 21 but it returns 
[1] 1 21

Вот еще один пример (по умолчанию data.frame () преобразует символы в множители)

df_2 = data.frame(V1 = letters[1:5],
                  V2 = 1:5)
df_2[3,] %>% as.numeric() # you expect to obtain c 3 but it returns
[1] 3 3
df_2[3,] %>% as.character() # this won't work neither
[1] "3" "3"

Чтобы предотвратить такое поведение, вам нужно позаботиться о факторе перед его извлечением:

df_1$V1 = df_1$V1 %>% as.character() %>% as.numeric()
df_2$V1 = df_2$V1 %>% as.character()
df_1[1,] %>% as.numeric()
[1] 11  21
df_2[3,] %>% as.character()
[1] "c" "3"
Ртист
источник
-3

Столбцы фреймов данных уже являются векторами, их нужно просто вытащить. Обратите внимание, что вы помещаете нужный столбец после запятой, а не перед ней:

> newV <- df[,1]
> newV
[1] 1 2 4 2

Если вам действительно нужна строка, то делайте то, что сказал Бен, и, пожалуйста, используйте слова правильно в будущем.

Джонатан Кристенсен
источник
но я думаю, что OP хочет первую строку ?
Бен Болкер
1
@BenBolker Может быть ... Я просто предположил, что он хочет того, что ему нужно в его титуле и вопросе.
Джонатан Кристенсен