簡體   English   中英

如何使用 dplyr 重命名選定的列,並將新列名作為字符串

[英]How to rename selected columns using dplyr with new column names as strings

我有以下小標題:

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

看起來像這樣:

> 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

我想要做的是用附加的字符串to_app <- ".xxx"替換Sepal.LengthPetal.Length導致:

  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

我試過這個錯誤:

>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="") ="

您可以rename_at()使用rename_at()函數(從dplyr_0.7.0開始)或rename_with() (從dplyr_1.0.0開始)。

例如,您可以將要重命名的變量作為字符串傳遞。 在您的示例中, paste0函數可用於將適當的后綴附加到每一列。

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

對於dplyr_1.0.0 ,使用rename_with() 函數參數在列參數之前。 您可以使用 tidy-select 函數all_of() (或其他)來選擇列。

rename_with(df, .fn = ~paste0(., to_app), .cols = all_of(cols) )

# 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                1.4
3              4.7         3.2              1.3
4              4.6         3.1              1.5
5              5           3.6              1.4

dplyr 的早期版本使用rename_at() 這已在 1.0.0 版中被取代,這意味着有新功能可以使用,但這個特定功能不會消失。

rename_at(df, cols, list( ~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

您還可以使用 select 輔助函數來選擇要重命名的變量,例如contains

rename_at(df, vars( contains("Length") ), list( ~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

list()編碼替換了從dplyr_0.7.0開始的之前的funs funs()編碼。 以前,例如funs( paste0(., to_app) )

編輯:這些天,我建議使用dplyr::rename_with ,根據@aosmith 的回答 編寫一個函數,將您的舊列名作為輸入並返回您的新列名作為輸出,您就完成了:)

我參加聚會有點晚了,但是在長時間盯着編程小插圖之后,我在不同的輸入和輸出變量中找到了相關示例。

在我更簡單的用例中,我只需要將列重命名為字符串的值:

> 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

因此,如果您願意手動執行此操作,則可以:

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

但是,如果您需要自動將".xxx"附加到提供給它的任何列名稱的內容,我建議您仔細查看該部分。 不幸的是,這仍然有點超出我的范圍,但我可以看到它是可行的>_>

如果要使用 dplyr 的rename函數,最好創建一個命名向量/列表,並在標准評估版本中使用.dots參數調用它:

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

但是請注意,這種方法可能會隨着 dplyr 的下一個版本 0.6.0 發生變化(參見例如http://blog.rstudio.org/2017/04/13/dplyr-0-6-0-coming-soon/http://dplyr.tidyverse.org/articles/programming.html )。

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

編輯:

為沒有正確閱讀而道歉。 這是一個帶有 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

假設目的是重命名所有包含“長度”的列:

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

dplyr開發版(5 月 11 日發布)中我能做的最好的事情:

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

要完全以編程方式執行此操作,需要改用quos

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

兩者都給出:

 # 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

一個班輪:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM