2017-01-12 1 views
0

Je tente de remplacer toutes les colonnes sélectionnées en utilisant select par des données de la même taille. Un exemple reproductible estComment puis-je remplacer plusieurs colonnes dans un fichier en utilisant select?

library(tidyverse) 
iris = as_data_frame(iris) 
temp = cbind(runif(nrow(iris)), runif(nrow(iris)), runif(nrow(iris)), runif(nrow(iris))) 
select(iris, -one_of("Petal.Length")) = temp 

Puis-je obtenir l'erreur

Erreur dans certains (iris, -one_of ("Petal.Length")) = temp: n'a pas pu trouver fonction "select"

Merci pour vos commentaires.

+0

pas aussi pratique, mais 'iris [, Grepl (» Petal.Length ", colnames (iris))] = temp'works – Haboryme

+0

ce n'est pas que R ne trouve pas la fonction' select' mais plutôt 'select <-'. Le comportement que vous voulez à la place de 'rownames' est différent de ce que' select' peut faire. – Drey

+0

@Haboryme merci. Je sais - avec l'approche data.frame habituelle c'est le chemin à avoir. Je pensais juste qu'il y a une façon «rangée» de le faire. – Richard

Répondre

1

Vous voulez lier des colonnes de deux trames de données, de sorte que vous pouvez simplement utiliser bind_cols():

library(tidyverse) 

iris <- as_tibble(iris) 
temp <- tibble(r1 = runif(nrow(iris)), r2 = runif(nrow(iris)), r3 = runif(nrow(iris)), r4 = runif(nrow(iris))) 

select(iris, -Petal.Length) %>% bind_cols(temp) 
# or use: 
# bind_cols(iris, temp) %>% select(-Petal.Length) 

qui vous donne:

# A tibble: 150 × 8 
    Sepal.Length Sepal.Width Petal.Width Species  r1  r2   r3  r4 
      <dbl>  <dbl>  <dbl> <fctr>  <dbl>  <dbl>  <dbl>  <dbl> 
1   5.1   3.5   0.2 setosa 0.7208566 0.1367070 0.04314771 0.4909396 
2   4.9   3.0   0.2 setosa 0.4101884 0.4795735 0.75318182 0.1463689 
3   4.7   3.2   0.2 setosa 0.6270065 0.5425814 0.26599432 0.1467248 
4   4.6   3.1   0.2 setosa 0.8001282 0.4691908 0.73060637 0.0792256 
5   5.0   3.6   0.2 setosa 0.5663895 0.4745482 0.65088630 0.5360953 
6   5.4   3.9   0.4 setosa 0.8813042 0.1560600 0.41734507 0.2582568 
7   4.6   3.4   0.3 setosa 0.5046977 0.9555570 0.22118401 0.9246906 
8   5.0   3.4   0.2 setosa 0.5283764 0.4730212 0.24982471 0.6313071 
9   4.4   2.9   0.2 setosa 0.5976045 0.4717439 0.14270551 0.2149888 
10   4.9   3.1   0.1 setosa 0.3919660 0.5125420 0.95001067 0.5259598 
# ... with 140 more rows 
+0

à droite, je peux appliquer une adaptation de cela. Merci. – Richard

+1

Vous pouvez également lier d'abord, puis sélectionnez, voir mon exemple mis à jour. – Daniel

+0

'bind'! = Remplacer; Si la liaison est ce que l'OP veut, alors il est conseillé de corriger la question ... – Drey

0

Nous pouvons utiliser -> pour affecter la sortie à « température »

select(iris, -one_of("Petal.Length")) -> temp 
+0

merci mais je veux avoir du temp dans le pépin et pas les colonnes du pépin en temp. – Richard

0

En utilisant tidyverse paradigma vous pouvez utiliser:

dplyr::mutate_at(iris, vars(-one_of("Petal.Length")), .funs = funs(runif)) 

Bien que l'exemple ci-dessus produit le comportement avec des nombres aléatoires, il sera ne correspond probablement pas à vos besoins - je suppose que vous voulez des fonctionnalités de correspondance et des lignes à celui-là dans temp. Cela peut être fait en transformant l'iris et la temp en long format et en rejoignant et en remplaçant les données en conséquence avec les méthodes *join par exemple.

+0

merci. Je veux juste remplacer les colonnes dans le tibble avec les valeurs en temp. – Richard

+0

Ensuite, l'approche @Haboryme dans le commentaire est la façon la plus directe de le faire. (donc pourquoi voulez-vous utiliser 'select' en premier lieu?) – Drey

+0

Je veux remplacer les colonnes et comme l'approche de Tidyverse est fortement annoncée, j'ai pensé que j'essaierais de m'en tenir à cela. – Richard