wake-up-neo.com

So benennen Sie ausgewählte Spalten mithilfe von dplyr mit neuen Spaltennamen als Zeichenfolgen um

Ich habe folgendes tibble:

library(tidyverse)
df <- structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5), Sepal.Width = c(3.5, 
3, 3.2, 3.1, 3.6), Petal.Length = c(1.4, 1.4, 1.3, 1.5, 1.4)), .Names = c("Sepal.Length", 
"Sepal.Width", "Petal.Length"), row.names = c(NA, 5L), class = c("tbl_df", 
"tbl", "data.frame"))

Das sieht doch so aus:

> df
# A tibble: 5 × 3
  Sepal.Length Sepal.Width Petal.Length
*        <dbl>       <dbl>        <dbl>
1          5.1         3.5          1.4
2          4.9         3.0          1.4
3          4.7         3.2          1.3
4          4.6         3.1          1.5
5          5.0         3.6          1.4

Ich möchte Sepal.Length und Petal.Length durch die angehängte Zeichenfolge to_app <- ".xxx" ersetzen, was Folgendes ergibt:

  Sepal.Length.xxx Sepal.Width Petal.Length.xxx
          5.1         3.5          1.4
          4.9         3.0          1.4
          4.7         3.2          1.3
          4.6         3.1          1.5
          5.0         3.6          1.4

Ich habe dies mit einem Fehler versucht:

>df %>% rename(paste(Sepal.Length,to_app,sep="") = Petal.Length,paste(Sepal.Width,to_app,sep="") = Petal.Length)
Error: unexpected '=' in "df %>% rename(paste(Sepal.Length,to_app,sep="") ="
6
neversaint

Wenn Sie die rename-Funktion von dplyr verwenden möchten, sollten Sie am besten einen benannten Vektor/eine Liste erstellen und diese mit dem Argument .dots in der Standard-Evaluierungsversion aufrufen:

cols <- c("Sepal.Length", "Petal.Length")
to_app <- ".xxx"
cols <- setNames(cols, paste0(cols, to_app))

df %>% rename_(.dots = cols)

## A tibble: 5 × 3
#  Sepal.Length.xxx Sepal.Width Petal.Length.xxx
#*            <dbl>       <dbl>            <dbl>
#1              5.1         3.5              1.4
#2              4.9         3.0              1.4
#3              4.7         3.2              1.3
#4              4.6         3.1              1.5
#5              5.0         3.6              1.4

Beachten Sie jedoch, dass sich dieser Ansatz mit der nächsten Version 0.6.0 von dplyr ändern kann (siehe zB http://blog.rstudio.org/2017/04/13/dplyr-0-6-0-coming- bald/ und http://dplyr.tidyverse.org/articles/programming.html ).

9

Sie können dazu die Funktion rename_at verwenden (beginnend mit dplyr_0.7.0 ).

Beispielsweise können Sie die Variablen, die Sie umbenennen möchten, als Zeichenfolgen übergeben. In Ihrem Beispiel kann die paste0-Funktion verwendet werden, um an jede Spalte das entsprechende Suffix anzuhängen.

cols = c("Sepal.Length", "Petal.Length")
to_app = ".xxx"

rename_at(df, cols, funs( paste0(., to_app) ) )

# A tibble: 5 x 3
  Sepal.Length.xxx Sepal.Width Petal.Length.xxx
*            <dbl>       <dbl>            <dbl>
1              5.1         3.5              1.4
2              4.9         3.0              1.4
3              4.7         3.2              1.3
4              4.6         3.1              1.5
5              5.0         3.6              1.4

Sie können auch die Hilfsfunktionen zum Auswählen verwenden, um Variablen für die Umbenennung auszuwählen, beispielsweise contains.

rename_at(df, vars( contains("Length") ), funs( paste0(., ".xxx") ) )

# A tibble: 5 x 3
  Sepal.Length.xxx Sepal.Width Petal.Length.xxx
*            <dbl>       <dbl>            <dbl>
1              5.1         3.5              1.4
2              4.9         3.0              1.4
3              4.7         3.2              1.3
4              4.6         3.1              1.5
5              5.0         3.6              1.4
8
aosmith

Ich bin etwas spät dran bei der Party, aber nachdem ich die -Programmierungsvignette lange anstarrte, fand ich das entsprechende Beispiel in der Different-Eingangs- und Ausgangsvariable .

In meinem einfacheren Anwendungsfall musste ich lediglich eine Spalte in den Wert einer Zeichenfolge umbenennen:

> df1 = data_frame(index = 1:5, value = c(10, 20, 30, 40, 50))
> df1
# A tibble: 5 x 2
  index value
  <int> <dbl>
1     1    10
2     2    20
3     3    30
4     4    40
5     5    50

> newname = 'blau'
> newname2 = 'wheee'

> df1 %>% rename(!!newname := value, !!newname2 := index)
# A tibble: 5 x 2
  wheee  blau
  <int> <dbl>
1     1    10
2     2    20
3     3    30
4     4    40
5     5    50

Wenn Sie das gerne manuell machen, können Sie einfach:

df %>%
  rename(!!paste("Sepal.Length", "xxx", sep = ".") := Sepal.Length)

Wenn Sie jedoch etwas benötigen, das automatisch ".xxx" an den Spaltennamen anfügt, empfehle ich Ihnen, sich diesen Abschnitt genau anzusehen. Es ist leider immer noch ein bisschen über meinen Kopf, aber ich kann sehen, dass es machbar ist> _>

7
rensa
df %>% setNames(paste0(names(.), to.app))

# A tibble: 5 × 3
  Sepal.Length.xxx Sepal.Width.xxx Petal.Length.xxx
*            <dbl>           <dbl>            <dbl>
1              5.1             3.5              1.4
2              4.9             3.0              1.4
3              4.7             3.2              1.3
4              4.6             3.1              1.5
5              5.0             3.6              1.4

BEARBEITEN:

Entschuldigung, dass ich nicht richtig gelesen habe. Hier ist eine Lösung mit dem Paket data.table.

var <- names(df)[c(1,3)]
df %>% setnames(., var, paste0(var, to.app))
df

# A tibble: 5 × 3
  Sepal.Length.xxx Sepal.Width Petal.Length.xxx
*            <dbl>       <dbl>            <dbl>
1              5.1         3.5              1.4
2              4.9         3.0              1.4
3              4.7         3.2              1.3
4              4.6         3.1              1.5
5              5.0         3.6              1.4
3
Adam Quek

Angenommen, Sie möchten alle Spalten umbenennen, die "Länge" enthalten:

colnames(df) <- ifelse(grepl("Length", colnames(df)), 
                       paste0(colnames(df), to_app), 
                       colnames(df))
2
neilfws

Das Beste, was ich in der Entwicklungsversion von dplyr tun kann (erscheint am 11. Mai):

cols <- c("Sepal.Length", "Petal.Length")
to_app <- ".xxx"
ns <- paste0(cols, to_app)

rename(df, 
       !!ns[1] := !!as.name(cols[1]), 
       !!ns[2] := !!as.name(cols[2]))

Um dies vollständig programmgesteuert durchzuführen, muss stattdessen quos verwendet werden:

xx <- do.call(quos, setNames(map(cols, as.name), ns))
rename(df, !!!xx)

Beide geben:

# A tibble: 5 × 3
  Sepal.Length.xxx Sepal.Width Petal.Length.xxx
*            <dbl>       <dbl>            <dbl>
1              5.1         3.5              1.4
2              4.9         3.0              1.4
3              4.7         3.2              1.3
4              4.6         3.1              1.5
5              5.0         3.6              1.4

Einzeiler:

rename(df, !!!do.call(quos, setNames(map(cols, as.name), paste0(cols, to_app))))
1
Axeman