1
votes

Créer un vecteur ou une liste avec le contenu de plusieurs colonnes

Je souhaite créer un vecteur ou une liste dans un ensemble de données concaténant les scores de plusieurs colonnes dans un autre ensemble de données.

Je peux le faire comme ceci:

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

Mais j'aurais besoin de 60 lignes de code. Je suis presque sûr qu'il existe une autre façon de procéder. Quand j'essaye ceci:

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

Je reçois ce message d'erreur

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

Mon ensemble de données ressemble à ceci

XXX

Et comme sortie, je voudrais juste un vecteur avec des valeurs pour chaque colonne l'une après l'autre, comme ceci:

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


4 commentaires

Pourriez-vous fournir un exemple de données?


Pardon, je ne suis pas en mesure de faire le tableau correctement, est-ce compréhensible, DJV?


vous pouvez utiliser unname (unlist (x))


également que la stratégie read.table () est un excellent moyen de partager des données dans des paramètres de forum comme SO


3 Réponses :


0
votes

Vous pouvez utiliser paste () . S'ils sont tous dans le même data.frame , vous pouvez créer une nouvelle colonne avec la concaténation.

[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

Sortie:

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

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

Exemple de données:

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

Modifier h1 >

S'ils sont dans des vecteurs différents, vous pouvez faire quelque chose comme ceci:

  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

Sortie:

require(tidyverse)

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

p >


11 commentaires

Merci! Ils ne sont pas dans le même ensemble de données. Et je ne veux pas d'une autre colonne, je veux que ce soit comme une liste dans un objet séparé. Dans votre exemple, le résultat que je voudrais obtenir serait une liste contenant: a, b, c, d, e, f, g, h, g, h, i, j, etc. Je suis désolé si je n'ai pas Je ne me suis pas bien expliqué ...


Pas de soucis, veuillez voir ma modification. C'est ce que vous vouliez dire?


J'ai le même message d'avertissement lorsque vous utilisez coller ... Dois-je nommer toutes les colonnes une par une? N'y a-t-il pas une manière plus propre de le faire? MERCI


Non, toujours pas de travail ... = (Même avertissement. Je fais ceci df <-mutate (conc = paste (x $ v1: xv2)) ## pour éviter de mettre tous les nombres jusqu'à 644


quel avertissement recevez-vous?


Erreur dans mutate _ (. Data, .dots = compat_as_lazy_dots (...)): l'argument ".data" est manquant, sans valeur par défaut En plus: Messages d'avertissement: 1: In t $ 1 : t $ 644 : l'expression numérique comporte 20 éléments: seul le premier utilisé


Merci pour votre modification !! L'erreur est toujours dans la même partie. J'ai besoin d'un moyen de remplacer "(a, b, c)" par "(a: c)" sans avoir cet avertissement ... Une idée?


Désolé, j'étais en retard sur vos modifications, hehe. C'est mieux! MERCI! Mais je crée toujours un autre ensemble de données, plutôt que des listes. Et en tout cas, ça me fait faire au moins trente lignes de code ... N'y a-t-il pas une façon plus appropriée de le faire?


Comment souhaitez-vous spécifier vos vecteurs d'entrée? sont-ils nommés au hasard? sont-ils les mêmes?


Non, ils ne sont pas aléatoires. Ils proviennent d'un ensemble de données contenant des scores. Les scores sont de 0 et 1. Je dois donc choisir les 0 et 1 dans chaque colonne et les mettre ensemble dans une chaîne / une liste / un vecteur ...


Font-ils tous partie de data.frame x? où chaque colonne est votre vecteur à concaténer?



0
votes

Une solution simple comme

my_vec = x[, 1:644]

pourrait-elle fonctionner?


1 commentaires

Non, cela ne fait que reproduire le jeu de données original. Mais merci quand même!



0
votes

En supposant que x est un data.frame:

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

La sortie peut être un vecteur de caractères, mais vous pouvez à nouveau rendre les valeurs numériques en utilisant as.numeric () .

Crédit:

J'ai eu l'idée en utilisant le post suivant comme guide

Comment diviser une trame de données R en vecteurs (dissocier)

EDIT:

En utilisant vos exemples de données, nous obtenons ce qui suit:

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


1 commentaires

J'essaierai ceci. Je pourrais le résoudre en utilisant une double boucle dans Excel mais je veux toujours le faire via R. Merci!