Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用purrr在几种情况下替换值?_R_Apply_Tidyverse_Purrr_Data Wrangling - Fatal编程技术网

如何使用purrr在几种情况下替换值?

如何使用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 <

这篇文章在2020年8月17日被编辑,以使这个例子看起来更像我的实际数据

日期总是以1或2位数字排在第一位。月份总是排在第二位,要么全部,要么部分,还有法语。年份总是以2或4位数排在第三位


我正在学习使用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