Перетворити рядок кадру даних у вектор


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

Я пропоную вам відформатувати дані, які ви показали правильно. Схоже, вам не вистачає деяких розривів рядків.
Chinmay Patil

Я хочу ряду. Рядок "1", а не стовпець "a".
Джоко

Чи є спосіб застосувати це до всіх рядків кадру даних і тим самим об'єднати всі вектори в один вектор?
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 = "числовий"), який є більш показовим. Це те, що робить a.numeric.

1
нема проблем. Я лише констатую, що за цю проблему вони дають абсолютно таку ж відповідь.
Бен Болкер

1
Можливо, було змінено тим часом, але сьогодні unlist дозволяє скидати імена: identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) (а btw df досі не є розумним іменем для data.frame ... ;-))
Andri Signorell

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, то ваш код робить перетворення результатів в числовий вектор ...
Бен Bolker

2
конкретно, коли ви використовуєте t(df)R, примушує кадр даних до матриці, в цьому випадку числову матрицю, оскільки всі елементи є числовими. Потім [,1]витягує перший стовпець (числовий вектор, оскільки надлишковий розмір автоматично випадає). as.vector()просто скидає імена (що ви також можете зробити з unname()).
Бен Болкер

Здається, це працює і для персонажів. Але ви праві щодо примусу. FWIW, моє рішення також буде працювати над персонажними кадрами даних .. з попередженням усіх даних, що перетворюються в символи
Chinmay Patil

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()

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

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


але я думаю, що ОП хоче першого ряду ?
Бен Болкер

1
@BenBolker Можливо, так ... Я просто припустив, що він хоче того, що його заголовок і питання говорили, що він хоче.
Джонатан Крістенсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.