我有一個資料框,其中一些列被命名為日期。例如,這樣的事情:
df_1 <- data_frame("id" = c('a','b','c','d'),
"gender" = c('m','f','f','m'),
"05/16/2017" = c(1,2,3,4),
"11/08/2016" = c(1,2,3,4),
"08/15/2016" = c(1,2,3,4))
df_1
# A tibble: 4 x 5
id gender `05/16/2017` `11/08/2016` `08/15/2016`
<chr> <chr> <dbl> <dbl> <dbl>
1 a m 1 1 1
2 b f 2 2 2
3 c f 3 3 3
4 d m 4 4 4
對于當前為日期的列,在格式中mm/dd/yyyy,我想提取mm和yyyy組件并使用它們將列重命名為election_yyyy_mm. 即我最終會得到如下所示的 df:
df_2 <- data_frame("id" = c('a','b','c','d'),
"gender" = c('m','f','f','m'),
"election_2017_05" = c(1,2,3,4),
"election_2016_11" = c(1,2,3,4),
"election_2016_08" = c(1,2,3,4))
df_2
# A tibble: 4 x 5
id gender election_2017_05 election_2016_11 election_2016_08
<chr> <chr> <dbl> <dbl> <dbl>
1 a m 1 1 1
2 b f 2 2 2
3 c f 3 3 3
4 d m 4 4 4
我想我有一個涉及 的部分解決方案stringr,但目前我必須運行str_extract兩次才能分別獲得mm和yyyy組件。我也不確定如何將向量傳遞給rename().
這是我到目前為止的兩個片段:
stringr::str_extract(c("05/16/2017", "11/08/2016", "08/15/2016"), "^[^/] ")
[1] "05" "11" "08"
stringr::str_extract(c("05/16/2017", "11/08/2016", "08/15/2016"), "[0-9]{4}")
[1] "2017" "2016" "2016"
任何人都可以幫助我 a)在一次呼叫(或某個其他函式)中提取兩個元素(theyyyy和mmbits str_extract),并且 b)將結果向量傳遞給rename?
uj5u.com熱心網友回復:
我們可以使用rename_with函式重命名。在重命名函式中,我們可以首先將字符決議為日期mdy(),然后提取month()和year()。最后,glue()元素重新組合在一起。
library(dplyr)
library(glue)
library(lubridate)
df_1 %>% rename_with( ~glue('election_{year(mdy(.x))}_{month(mdy(.x))}'),
matches("\\d{2}/\\d{2}/\\d{4}"))
輸出
# A tibble: 4 × 5
id gender election_2017_5 election_2016_11 election_2016_8
<chr> <chr> <dbl> <dbl> <dbl>
1 a m 1 1 1
2 b f 2 2 2
3 c f 3 3 3
4 d m 4 4 4
我們還可以使用stringr::string_extract_all向量而不是單個字符元素。使用來自 OP 嘗試的修改后的正則運算式,我們可以在一次呼叫中提取月份和年份。只需提取是(|)數字(\\d )從一開始(^)或結尾($字串)"^\\d |\\d $"。
答案是這樣的:
df_1 %>% rename_with( ~stringr::str_extract_all(.x, "^\\d |\\d $") %>%
map_chr(~glue('election_{.x[2]}_{.x[1]}')),
matches("\\d{2}/\\d{2}/\\d{4}"))
uj5u.com熱心網友回復:
使用 tidyverse(dplyr 和 stringr),我們可以像這樣重命名列:
library(dplyr)
df_1 %>%
rename_with(
.cols = contains("/"), # selects only the date columns
~ paste0(
"election_",
stringr::str_sub(.x, -4, -1), # last 4 digits/letters
"_",
stringr::str_sub(.x, 1, 2) # first 2 digits/letters
)
)
結果:
# A tibble: 4 x 5
id gender election_2017_05 election_2016_11 election_2016_08
<chr> <chr> <dbl> <dbl> <dbl>
1 a m 1 1 1
2 b f 2 2 2
3 c f 3 3 3
4 d m 4 4 4
uj5u.com熱心網友回復:
這是使用正則運算式的單行:
names(df_1) <- sub("(\\d ).*?(\\d )$", "election_\\2_\\1", names(df_1))
這是如何作業的:首先,您將列名分成兩個捕獲組:
(\\d ):第一個捕獲組,捕獲前兩位數.*?此后的任何事情,直到...(\\d )$: ... 第二個捕獲組,捕獲最后一位數字。
然后,使用sub的替換引數,將字串添加election_到匹配的名稱中,并使用反向參考\\1和以相反的順序參考回兩個捕獲組\\2。
使用stringr:
library(stringr)
names(df_1) <- str_replace(names(df_1), "(\\d ).*?(\\d )$", "election_\\2_\\1")
結果:
df_1
# A tibble: 4 × 5
id gender election_2017_05 election_2016_11 election_2016_08
<chr> <chr> <dbl> <dbl> <dbl>
1 a m 1 1 1
2 b f 2 2 2
3 c f 3 3 3
4 d m 4 4 4
uj5u.com熱心網友回復:
這是一種替代方法:
library(dplyr)
library(stringr)
df_1 %>%
rename_with(~str_c('election',str_sub(.x, -4,-1),str_sub(.x,-10,-9), sep = "_"), where(is.numeric))
id gender election_2017_05 election_2016_11 election_2016_08
<chr> <chr> <dbl> <dbl> <dbl>
1 a m 1 1 1
2 b f 2 2 2
3 c f 3 3 3
4 d m 4 4 4
uj5u.com熱心網友回復:
另一種方法有dplyr但沒有stringr.
這里使用rename_with選擇列/,拆分字串/并使用 sapply 將拆分的結果連接在一起作為可用于重命名的向量。
df_1 %>%
rename_with(.cols = contains('/'),
~ strsplit(.x, '/') %>%
sapply(
function(x) paste0('election_',x[3],'_',x[2]),
simplify=TRUE)
)
編輯以洗掉as.character@GuedesBF 在評論中解釋的呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/396944.html
下一篇:如何讀取一列中的多種日期格式?
