使用自定义函数使用dplyr对表的每一行进行警告?

时间:2014-10-30 20:54:19

标签: r dplyr

我正在尝试使用自定义函数复制this之类的内容,但我收到错误。我有以下数据框

> dd
   datetimeofdeath injurydatetime
1                   2/10/05 17:30
2                   2/13/05 19:15
3                    2/15/05 1:10
4    2/24/05 21:00  2/16/05 20:36
5                    3/11/05 0:45
6                   3/19/05 23:05
7                   3/19/05 23:13
8                   3/23/05 20:51
9                   3/31/05 11:30
10                    4/9/05 3:07

这些类型是整数,但由于某种原因,它们的级别就好像它们是因素一样。这可能是我问题的根源,但我不确定。

> typeof(dd$datetimeofdeath)
[1] "integer"
> typeof(dd$injurydatetime)
[1] "integer"
> dd$injurydatetime
 [1] 2/10/05 17:30 2/13/05 19:15 2/15/05 1:10  2/16/05 20:36 3/11/05 0:45  3/19/05 23:05 3/19/05 23:13 3/23/05 20:51 3/31/05 11:30
[10] 4/9/05 3:07  
549 Levels:  1/1/07 18:52 1/1/07 20:51 1/1/08 17:55 1/1/11 15:25 1/1/12 0:22 1/1/12 22:58 1/11/06 23:50 1/11/07 6:26 ... 9/9/10 8:15

现在我想应用以下函数rowwise()

library(lubridate)
library(dplyr)
get_time_alive = function(datetimeofdeath, injurydatetime)
{
  if(as.character(datetimeofdeath) == "" | as.character(injurydatetime) == "") return(NA)

  time_of_death = parse_date_time(as.character(datetimeofdeath), "%m/%d/%y %H:%M")
  time_of_injury = parse_date_time(as.character(injurydatetime), "%m/%d/%y %H:%M")

  time_alive = as.duration(new_interval(time_of_injury,time_of_death))
  time_alive_hours = as.numeric(time_alive) / (60*60)

  return(time_alive_hours)
}

这适用于各行,但不是在我按行进行操作时。

> get_time_alive(dd$datetimeofdeath[1], dd$injurydatetime[1])
[1] NA
> get_time_alive(dd$datetimeofdeath[4], dd$injurydatetime[4])
[1] 192.4
> dd = dd %>% rowwise() %>% dplyr::mutate(time_alive_hours=get_time_alive(datetimeofdeath, injurydatetime))
There were 20 warnings (use warnings() to see them)
> dd
Source: local data frame [10 x 3]
Groups: 

   datetimeofdeath injurydatetime time_alive_hours
1                   2/10/05 17:30               NA
2                   2/13/05 19:15               NA
3                    2/15/05 1:10               NA
4    2/24/05 21:00  2/16/05 20:36               NA
5                    3/11/05 0:45               NA
6                   3/19/05 23:05               NA
7                   3/19/05 23:13               NA
8                   3/23/05 20:51               NA
9                   3/31/05 11:30               NA
10                    4/9/05 3:07               NA

正如你所看到的那样,第四个元素是NA,即使我自己将自定义函数应用于它时,我得到了192.4。为什么我的自定义功能在这里失败?

1 个答案:

答案 0 :(得分:0)

我认为你可以简化你的代码并使用这样的东西:

dd %>% 
  mutate_each(funs(as.POSIXct(as.character(.), format = "%m/%d/%y %H:%M"))) %>% 
  mutate(time_alive = datetimeofdeath - injurydatetime)
#      datetimeofdeath      injurydatetime    time_alive
#1                <NA> 2005-02-15 01:10:00       NA days
#2 2005-02-24 21:00:00 2005-02-16 20:36:00 8.016667 days
#3                <NA> 2005-03-11 00:45:00       NA days

附注:

  • 我缩短了您的输入数据,因为它不容易复制(我只拿了你在答案中看到的那三行)
  • 如果你想要&#34; time_alive&#34;以小时格式化,只需在最后一个mutate中使用mutate(time_alive = (datetimeofdeath - injurydatetime)*24)
  • 如果您使用此代码,则不需要rowwise() - 这也应该让它更快,我想