2017-05-16 65 views
1

我在嘗試使用兩個列表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中日期列的list,difftime。其結果是這樣的:

$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 

任何想法?

回答

1

我們需要使用[[代替[

Map(function(...) data.frame(difftime = as.numeric(difftime(...))), 
       lapply(list_1, `[[`, 1), lapply(list_2, `[[`, 1)) 
提取作爲 vector