【问题标题】:mapply on subset of lists在列表子集上映射
【发布时间】:2017-05-16 14:39:52
【问题描述】:

我正在尝试使用data.frames 的两个列表(使用mapplysapply)对日期进行操作。这是我的两个列表:

list_1 <- list(a=data.frame(date=c("2017-01-01","2017-02-02"),v1=1:2,
                stringsAsFactors = FALSE),
               b=data.frame(date=c("2017-03-03","2017-04-04"),v1=3:4,
                stringsAsFactors = FALSE))
list_2 <- list(a=data.frame(date=c("2018-01-01","2018-02-02"),v1=1:2,
                    stringsAsFactors = FALSE),
               b=data.frame(date=c("2018-03-03","2018-04-04"),v1=3:4,
                 stringsAsFactors = FALSE))

我想使用两个列表在日期列上应用一个函数。对于这个例子,让我们使用difftime。我想获得 list_1 和 list_2 中日期列的 listdifftime。结果如下所示:

$a
  difftime
1 365
2 365

$b
  difftime
1 365
2 365

我已尝试使用以下方法制作列表的子集以仅保留日期列:

subset_list_1 <- lapply(list_1, "[", 1)
subset_list_2 <- lapply(list_2, "[", 1)

但是,结果仍然是data.frame。由于某种原因,通常与"[" 一起应用的drop=TRUE 没有发生。

> str(subset_list_1)
List of 2
 $ a:'data.frame':  2 obs. of  1 variable:
  ..$ date: chr [1:2] "2017-01-01" "2017-02-02"
 $ b:'data.frame':  2 obs. of  1 variable:
  ..$ date: chr [1:2] "2017-03-03" "2017-04-04" 

然后我尝试了mapplysapply,但我怀疑它会引发错误,因为我没有将向量提供给difftime

mapply(difftime,subset_list_1,subset_list_2,SIMPLIFY = FALSE)
Error in as.POSIXct.default(time1) : 
  do not know how to convert 'time1' to class “POSIXct”

sapply(subset_list_2,difftime,subset_list_1)
Error in as.POSIXct.default(time1) : 
  do not know how to convert 'time1' to class “POSIXct”

换句话说,我正在尝试使用mapplysapply 执行以下操作:

difftime(unclass(subset_list_2[[1]])$date,unclass(subset_list_1[[1]])$date)
Time differences in days
[1] 365 365
difftime(unclass(subset_list_2[[2]])$date,unclass(subset_list_1[[2]])$date)
Time differences in days
[1] 365 365

有什么想法吗?

【问题讨论】:

    标签: r sapply mapply


    【解决方案1】:

    我们需要使用[[ 而不是[ 提取为vector

    Map(function(...) data.frame(difftime = as.numeric(difftime(...))), 
                    lapply(list_1, `[[`, 1), lapply(list_2, `[[`, 1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多