映射到列表的子集
mapply on subset of lists
我正在尝试使用 mapply
或 sapply
的两个 data.frames
列表对日期进行操作。这是我的两个列表:
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"
然后我尝试了 mapply
和 sapply
,但我怀疑它会抛出错误,因为我没有向 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”
换句话说,我正在尝试执行以下操作,但使用 mapply
或 sapply
:
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
有什么想法吗?
我们需要使用 [[
而不是 [
提取为 vector
Map(function(...) data.frame(difftime = as.numeric(difftime(...))),
lapply(list_1, `[[`, 1), lapply(list_2, `[[`, 1))
我正在尝试使用 mapply
或 sapply
的两个 data.frames
列表对日期进行操作。这是我的两个列表:
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"
然后我尝试了 mapply
和 sapply
,但我怀疑它会抛出错误,因为我没有向 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”
换句话说,我正在尝试执行以下操作,但使用 mapply
或 sapply
:
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
有什么想法吗?
我们需要使用 [[
而不是 [
vector
Map(function(...) data.frame(difftime = as.numeric(difftime(...))),
lapply(list_1, `[[`, 1), lapply(list_2, `[[`, 1))