如何使用purrr在几种情况下替换值?
这篇文章在2020年8月17日被编辑,以使这个例子看起来更像我的实际数据 日期总是以1或2位数字排在第一位。月份总是排在第二位,要么全部,要么部分,还有法语。年份总是以2或4位数排在第三位如何使用purrr在几种情况下替换值?,r,apply,tidyverse,purrr,data-wrangling,R,Apply,Tidyverse,Purrr,Data Wrangling,这篇文章在2020年8月17日被编辑,以使这个例子看起来更像我的实际数据 日期总是以1或2位数字排在第一位。月份总是排在第二位,要么全部,要么部分,还有法语。年份总是以2或4位数排在第三位 我正在学习使用tidyverse软件包编写代码。我试图用其他字符串替换变量中的每个元素,如果它们符合特定条件。问题是我一次只能做一个条件。我想知道如何实现它在几个条件a的时间 下面是一个可复制的示例: library(tidyverse) library(magrittr) tib <
我正在学习使用tidyverse软件包编写代码。我试图用其他字符串替换变量中的每个元素,如果它们符合特定条件。问题是我一次只能做一个条件。我想知道如何实现它在几个条件a的时间 下面是一个可复制的示例:
library(tidyverse)
library(magrittr)
tib <- tibble(
ID = 1:6,
Date = c("1-JAN-20", "15-JUILL-20", "30 DEC 2020",
"1-JAN-20", "15-JUILL-20", "30 DEC 2020"),
Comm = c("Should be 2020-01-01", "Should be 2020-06-15", "Should be 2020-12-30",
"Should be 2020-01-01", "Should be 2020-06-15", "Should be 2020-12-30"))
head(tib)
# A tibble: 6 x 3
ID Date Comm
<int> <chr> <chr>
1 1 1-JAN-20 Should be 2020-01-01
2 2 15-JUILL-20 Should be 2020-06-15
3 3 30 DEC 2020 Should be 2020-12-30
4 4 1-JAN-20 Should be 2020-01-01
5 5 15-JUILL-20 Should be 2020-06-15
6 6 30 DEC 2020 Should be 2020-12-30
# Returns the unique values of the character variables execept the "Comm" one. So, it
# returns only one in that case, but my original data have severals ones.
tib %>% select(where(is.character), -Comm) %>% map(~ unique(.x))
$Date
[1] "1-JAN-20" "15-JUILL-20" "30 DEC 2020"
库(tidyverse)
图书馆(magrittr)
tib%select(其中(是.character),-Comm)%%>%map(~unique(.x))
$Date
[1] “1-JAN-20”“15-JUILL-20”“2020年12月30日”
我们到了!下面的代码可以工作,但我想知道是否有更好的方法来接收它,而不是每次复制/传递相同的代码行并对其进行更改
tib <- tib %>% mutate(Date = case_when(Date == "1-JAN-20" ~ "2020-01-01",
Date == "15-JUILL-20" ~ "2020-06-15",
Date == "30 DEC 2020" ~ "2020-12-01"))
head(tib)
# A tibble: 6 x 3
ID Date Comm
<int> <chr> <chr>
1 1 2020-01-01 Should be 2020-01-01
2 2 2020-06-15 Should be 2020-06-15
3 3 2020-12-01 Should be 2020-12-30
4 4 2020-01-01 Should be 2020-01-01
5 5 2020-06-15 Should be 2020-06-15
6 6 2020-12-01 Should be 2020-12-30
tib%突变(日期=案例)何时(日期==“1-JAN-20”~“2020-01-01”,
日期==“15-JUILL-20”~“2020-06-15”,
日期==“2020年12月30日”~“2020-12-01”))
头部(tib)
#一个tibble:6x3
ID日期通信
1 2020-01-01应为2020-01-01
2020-06-15应该是2020-06-15
3 2020-12-01应为2020-12-30
4 2020-01-01应为2020-01-01
5 2020-06-15应为2020-06-15
6 2020-12-01应为2020-12-30
既然我必须对其他变量进行这种操作,那么我如何构建一个函数来实现这一点呢
另外,我想知道你是否知道一些学习Purrr软件包的好文档/教程
谢谢你,祝你今天愉快 您可以在以下情况下尝试dplyr::case\u:
library(magrittr)
library(purrr)
# A tibble that looks like my data.
tib <- tibble(
ID = 1:6,
Date = c("01-JAN-20", "15-JUN-20", "30 DEC 2020",
"01-JAN-20", "15-JUN-20", "30 DEC 2020"),
Comm = c("Should be 2020-01-01", "Should be 2020-06-15", "Should be 2020-12-30",
"Should be 2020-01-01", "Should be 2020-06-15", "Should be 2020-12-30"))
head(tib)
tib %>% select(where(is.character), -Comm) %>% map(~ unique(.x))
tib <- tib %>% mutate(Date = dplyr::case_when(Date == "01-JAN-20" ~ "2020-01-01",
Date == "15-JUN-20" ~ "2020-06-15",
Date == "30 DEC 2020" ~ "2020-12-01"))
> tib
# A tibble: 6 x 3
ID Date Comm
<int> <chr> <chr>
1 1 2020-01-01 Should be 2020-01-01
2 2 2020-06-15 Should be 2020-06-15
3 3 2020-12-01 Should be 2020-12-30
4 4 2020-01-01 Should be 2020-01-01
5 5 2020-06-15 Should be 2020-06-15
6 6 2020-12-01 Should be 2020-12-30
库(magrittr)
图书馆(purrr)
#一个看起来像我的数据的TIBLE。
tib%select(其中(是.character),-Comm)%%>%map(~unique(.x))
tib%突变(日期=dplyr::情况_何时(日期==“01-JAN-20”~“2020-01-01”,
日期==“20年6月15日”~“2020年6月15日”,
日期==“2020年12月30日”~“2020-12-01”))
>蒂布
#一个tibble:6x3
ID日期通信
1 2020-01-01应为2020-01-01
2020-06-15应该是2020-06-15
3 2020-12-01应为2020-12-30
4 2020-01-01应为2020-01-01
5 2020-06-15应为2020-06-15
6 2020-12-01应为2020-12-30
这里最好的办法是使用“anytime”包将日期列转换为日期类。尽管您必须手动修复日期列,以便所有年份都有4位数字。如果年份总是在日期的最后一个位置,那么这是一件容易的事情。也许您可以在以下情况下尝试dplyr::case\u:
library(magrittr)
library(purrr)
# A tibble that looks like my data.
tib <- tibble(
ID = 1:6,
Date = c("01-JAN-20", "15-JUN-20", "30 DEC 2020",
"01-JAN-20", "15-JUN-20", "30 DEC 2020"),
Comm = c("Should be 2020-01-01", "Should be 2020-06-15", "Should be 2020-12-30",
"Should be 2020-01-01", "Should be 2020-06-15", "Should be 2020-12-30"))
head(tib)
tib %>% select(where(is.character), -Comm) %>% map(~ unique(.x))
tib <- tib %>% mutate(Date = dplyr::case_when(Date == "01-JAN-20" ~ "2020-01-01",
Date == "15-JUN-20" ~ "2020-06-15",
Date == "30 DEC 2020" ~ "2020-12-01"))
> tib
# A tibble: 6 x 3
ID Date Comm
<int> <chr> <chr>
1 1 2020-01-01 Should be 2020-01-01
2 2 2020-06-15 Should be 2020-06-15
3 3 2020-12-01 Should be 2020-12-30
4 4 2020-01-01 Should be 2020-01-01
5 5 2020-06-15 Should be 2020-06-15
6 6 2020-12-01 Should be 2020-12-30
库(magrittr)
图书馆(purrr)
#一个看起来像我的数据的TIBLE。
tib%select(其中(是.character),-Comm)%%>%map(~unique(.x))
tib%突变(日期=dplyr::情况_何时(日期==“01-JAN-20”~“2020-01-01”,
日期==“20年6月15日”~“2020年6月15日”,
日期==“2020年12月30日”~“2020-12-01”))
>蒂布
#一个tibble:6x3
ID日期通信
1 2020-01-01应为2020-01-01
2020-06-15应该是2020-06-15
3 2020-12-01应为2020-12-30
4 2020-01-01应为2020-01-01
5 2020-06-15应为2020-06-15
6 2020-12-01应为2020-12-30
这里最好的办法是使用“anytime”包将日期列转换为日期类。尽管您必须手动修复日期列,以便所有年份都有4位数字。如果年份总是在日期的最后一个位置,这很容易做到。在处理日期/时间时,应使用标准的日期-时间函数进行操作。不要使用
str\u replace
逐个替换日期。假设你有1000个不同年份的日期,实际上不可能一一列出。在这种情况下,可以使用lubridate::dmy
将它们转换为日期对象,对于更复杂的情况,可以使用lubridate::parse_date_time
将不同格式的变量转换为日期
tib %>% dplyr::mutate(new_date = lubridate::dmy(Date))
# ID Date Comm new_date
# <int> <chr> <chr> <date>
#1 1 01-JAN-20 Should be 2020-01-01 2020-01-01
#2 2 15-JUN-20 Should be 2020-06-15 2020-06-15
#3 3 30 DEC 2020 Should be 2020-12-30 2020-12-30
#4 4 01-JAN-20 Should be 2020-01-01 2020-01-01
#5 5 15-JUN-20 Should be 2020-06-15 2020-06-15
#6 6 30 DEC 2020 Should be 2020-12-30 2020-12-30
tib%>%dplyr::mutate(new_date=lubridate::dmy(date))
#ID日期通信新日期
#
#1 1 01-JAN-20应为2020-01-01 2020-01-01
#2 20年6月15日应为2020-06-15 2020-06-15
#3 2020年12月30日应为2020-12-30 2020-12-30
#4 4 01-1-20应为2020-01-01 2020-01-01
#5 20年6月15日应为2020-06-15 2020-06-15
#6 6 2020年12月30日应为2020-12-30 2020-12-30
如果您希望日期采用特定格式,则可以在处理日期/时间时使用
新建日期上的格式功能。不要使用str\u replace
逐个替换日期。假设你有1000个不同年份的日期,实际上不可能一一列出。在这种情况下,可以使用lubridate::dmy
将它们转换为日期对象,对于更复杂的情况,可以使用lubridate::parse_date_time
将不同格式的变量转换为日期
tib %>% dplyr::mutate(new_date = lubridate::dmy(Date))
# ID Date Comm new_date
# <int> <chr> <chr> <date>
#1 1 01-JAN-20 Should be 2020-01-01 2020-01-01
#2 2 15-JUN-20 Should be 2020-06-15 2020-06-15
#3 3 30 DEC 2020 Should be 2020-12-30 2020-12-30
#4 4 01-JAN-20 Should be 2020-01-01 2020-01-01
#5 5 15-JUN-20 Should be 2020-06-15 2020-06-15
#6 6 30 DEC 2020 Should be 2020-12-30 2020-12-30
tib%>%dplyr::mutate(new_date=lubridate::dmy(date))
#ID日期通信新日期
#
#1 1 01-JAN-20应为2020-01-01 2020-01-01
#2 20年6月15日应为2020-06-15 2020-06-15
#3 2020年12月30日应为2020-12-30 2020-12-30
#4 4 01-1-20应为2020-01-01 2020-01-01
#5 20年6月15日应为2020-06-15 2020-06-15
#6 6 2020年12月30日应为2020-12-30 2020-12-30