Создать вектор или список с содержанием нескольких столбцов - PullRequest
0 голосов
/ 12 марта 2019

Я хочу создать вектор или список в наборе данных, объединяющий оценки нескольких столбцов в другом наборе данных.

Я могу сделать это так:

my_vec <- c(x$v1, x$v2, x$v3...)

Но мне нужно 60 строк кода. Я уверен, что есть другой способ сделать это. Когда я пытаюсь это:

my_vec <- c(x$v1:x$v644)

Я получаю это сообщение об ошибке

Warning messages:
1: In t$`1`:t$`644` :
  numerical expression has 20 elements: only the first used

Мой набор данных выглядит следующим образом

x <- read.table(
  text = "  v1   v2  V3   
  0      1     0
  1      0     1
  0      0     0
  0      0     1
  1      0     0",
  header = TRUE
)

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

my_vec <- c(0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0)

Ответы [ 3 ]

0 голосов
/ 12 марта 2019

может ли работать такое простое решение, как

my_vec = x[, 1:644]

?

0 голосов
/ 12 марта 2019

Предполагая, что x является data.frame:

> as.vector(unlist( split(as.matrix(x), row(x)) ))

Вывод может быть вектором символов, однако вы можете снова сделать значения числовыми, используя as.numeric () .

Кредит:

Получил идею, используя следующий пост в качестве руководства

Как разбить фрейм данных R на векторы (отменить привязку)

EDIT:

Используя данные вашего примера, мы получаем следующее:

x <- read.table(
  text = "  v1   v2  V3   
  0      1     0
  1      0     1
  0      0     0
  0      0     1
  1      0     0",
  header = TRUE
)

> as.vector(unlist( split(as.matrix(x), row(x)) ))
[1] 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0
0 голосов
/ 12 марта 2019

Вы можете использовать paste(). Если они все в одном data.frame, вы можете создать новый столбец с конкатенацией.

require(tidyverse)

df %>% 
  mutate(conc = paste(a, b, c))

Выход:

  a b c  conc
1 a e g a e g
2 b f h b f h
3 c g i c g i
4 d h j d h j

Пример данных:

df <- data.frame(a = letters[1:4], 
                 b = letters[5:8], 
                 c = letters[7:10])

Редактировать

Если они находятся в разных векторах, вы можете сделать что-то вроде этого:

a <- letters[1:4]
b <- letters[5:8] 
c <- letters[7:10]

reduce(list(a, b, c), union)

Выход:

[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...