Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.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
R 在isn处使用函数mutate_';t按预期迭代函数_R_Dplyr_Mutate - Fatal编程技术网

R 在isn处使用函数mutate_';t按预期迭代函数

R 在isn处使用函数mutate_';t按预期迭代函数,r,dplyr,mutate,R,Dplyr,Mutate,我有一个专栏,我想把它转换成秒。转换函数可以工作,但是当我尝试使用mutate_at迭代多个列时。它没有像我期望的那样工作。我不知道我在mutate_at语法中缺少了什么 我有这个: catalog # A tibble: 4 x 3 # file start end # <chr> <chr> <chr> #1 20190506_2059

我有一个专栏,我想把它转换成秒。转换函数可以工作,但是当我尝试使用
mutate_at
迭代多个列时。它没有像我期望的那样工作。我不知道我在
mutate_at
语法中缺少了什么

我有这个:

catalog
# A tibble: 4 x 3
#  file                              start end  
#  <chr>                             <chr> <chr>
#1 20190506_205959-20190506_210459   1:58  3:00 
#2 20190506_210507-20190506_211007   0     0:32 
#3 20190506_205959-20190506_210459_2 0     3:18 
#4 20190506_220712-20190506_221210   0     5  

transform_time_to_seconds <- function(x) {
    x %>% 
        str_split(":", simplify = TRUE) %>% 
        as.numeric() %>% 
        {.[1] * 60 + 
         ifelse(is.na(.[2]), 0, .[2])}
}
但我期望的是:

catalog %>%
    mutate(start = map_dbl(start, transform_time_to_seconds),
           end   = map_dbl(end, transform_time_to_seconds))
# A tibble: 4 x 3
#  file                              start   end
#  <chr>                             <dbl> <dbl>
#1 20190506_205959-20190506_210459     118   180
#2 20190506_210507-20190506_211007       0    32
#3 20190506_205959-20190506_210459_2     0   198
#4 20190506_220712-20190506_221210       0   300

函数一次需要一个值,而传递的是整个列

按行添加

library(dplyr)

catalog %>%
  rowwise() %>%
  mutate_at(vars(start, end), transform_time_to_seconds)

# A tibble: 4 x 3
#  file                              start   end
#  <chr>                             <dbl> <dbl>
#1 20190506_205959-20190506_210459     118   180
#2 20190506_210507-20190506_211007       0    32
#3 20190506_205959-20190506_210459_2     0   198
#4 20190506_220712-20190506_221210       0   300
库(dplyr)
目录%>%
行()
在(变量(开始,结束),将时间转换为秒)
#一个tibble:4x3
#文件开始和结束
#                                
#1 20190506_205959-20190506_210459     118   180
#2 20190506_210507-20190506_211007       0    32
#3 20190506_205959-20190506_210459_2     0   198
#4 20190506_220712-20190506_221210       0   300

您还可以
矢量化您的函数

transform_time_to_seconds <- Vectorize(transform_time_to_seconds)

transform\u time\u to\u seconds似乎问题出在从矩阵工作中,正如您的
str\u split所返回的那样。在
mutate_at
之前添加
rowwise
:这将获得预期的输出。我认为这是因为
mutate.*
函数期望一次沿着整个向量工作,这是由矩阵抛出的。重复
catalog%>%groupby(1:n())%>%mutate_at(vars(start,end),transform_time_to_seconds)%>%select(-4)
这是非常聪明的,我相信如果计算成本受到威胁,这将使我们受益最大+1.
library(dplyr)

catalog %>%
  rowwise() %>%
  mutate_at(vars(start, end), transform_time_to_seconds)

# A tibble: 4 x 3
#  file                              start   end
#  <chr>                             <dbl> <dbl>
#1 20190506_205959-20190506_210459     118   180
#2 20190506_210507-20190506_211007       0    32
#3 20190506_205959-20190506_210459_2     0   198
#4 20190506_220712-20190506_221210       0   300
transform_time_to_seconds <- Vectorize(transform_time_to_seconds)