Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 apply_R_Apply - Fatal编程技术网

如何在不更改函数的情况下使用R apply

如何在不更改函数的情况下使用R apply,r,apply,R,Apply,我有一个基本字符date toPOSIXct函数 charDateToPosixct <- function(chrDate, format, timeZone) { as.POSIXct(chrDate, format=format, tz=timeZone) } charDateToPosixct像这样在apply中使用匿名函数 apply(df, 1, function(x) charDateToPosixct(x[1], "%m/%d/%y", x[2])) #[1] 1

我有一个基本字符date to
POSIXct
函数

charDateToPosixct <- function(chrDate, format, timeZone) {
    as.POSIXct(chrDate, format=format, tz=timeZone)
}

charDateToPosixct像这样在
apply
中使用匿名函数

apply(df, 1, function(x) charDateToPosixct(x[1], "%m/%d/%y", x[2]))
#[1] 1587787200 1587704400 1587020400 1593489600
编辑

您可以使用
apply
将得到的数值向量转换为
POSIXct

as.POSIXct(apply(df, 1, function(x) charDateToPosixct(x[1], "%m/%d/%y", x[2])), origin='1970-01-01')
[1] "2020-04-25 05:00:00 CDT" "2020-04-24 06:00:00 CDT" "2020-04-16 08:00:00 CDT" "2020-06-30 05:00:00 CDT"
或者,您可以使用
lappy
获取
POSIXct
对象的列表。然后可以与
do.call
c
Reduce
(必须将
用作.character
,因为在创建
数据.frame
时隐式使用了
stringsAsFactors=TRUE

或者,如果您有2个向量,您甚至不需要
data.frame

do.call(c, lapply(seq_len(NROW(df)), function(i) {
  charDateToPosixct(as.character(df$date[i]), "%m/%d/%Y", as.character(df$timezone[i]))
}))
do.call(c, lapply(seq_along(chrDate), function(i) {
    charDateToPosixct(chrDate[i], "%m/%d/%Y", timeZone[i])
}))
或者,使用
Reduce

Reduce(c, lapply(seq_along(chrDate), function(i) {
    charDateToPosixct(chrDate[i], "%m/%d/%Y", timeZone[i])
}))
我的时区是CDT,所以上面的任何一个给我

[1] "2012-04-24 23:00:00 CDT" "2012-04-24 00:00:00 CDT" "2012-04-16 02:00:00 CDT" "2012-06-29 23:00:00 CDT"

像这样使用
apply
中的匿名函数

apply(df, 1, function(x) charDateToPosixct(x[1], "%m/%d/%y", x[2]))
#[1] 1587787200 1587704400 1587020400 1593489600
编辑

您可以使用
apply
将得到的数值向量转换为
POSIXct

as.POSIXct(apply(df, 1, function(x) charDateToPosixct(x[1], "%m/%d/%y", x[2])), origin='1970-01-01')
[1] "2020-04-25 05:00:00 CDT" "2020-04-24 06:00:00 CDT" "2020-04-16 08:00:00 CDT" "2020-06-30 05:00:00 CDT"
或者,您可以使用
lappy
获取
POSIXct
对象的列表。然后可以与
do.call
c
Reduce
(必须将
用作.character
,因为在创建
数据.frame
时隐式使用了
stringsAsFactors=TRUE

或者,如果您有2个向量,您甚至不需要
data.frame

do.call(c, lapply(seq_len(NROW(df)), function(i) {
  charDateToPosixct(as.character(df$date[i]), "%m/%d/%Y", as.character(df$timezone[i]))
}))
do.call(c, lapply(seq_along(chrDate), function(i) {
    charDateToPosixct(chrDate[i], "%m/%d/%Y", timeZone[i])
}))
或者,使用
Reduce

Reduce(c, lapply(seq_along(chrDate), function(i) {
    charDateToPosixct(chrDate[i], "%m/%d/%Y", timeZone[i])
}))
我的时区是CDT,所以上面的任何一个给我

[1] "2012-04-24 23:00:00 CDT" "2012-04-24 00:00:00 CDT" "2012-04-16 02:00:00 CDT" "2012-06-29 23:00:00 CDT"

如果我使用df$date1,这就是
apply
的工作方式。我的结果与你使用你所说的变通方法得到的结果相匹配。问题的第二部分,我说的交替或变通方法是错误的,所以我省略了。抱歉4混淆。从
?在值部分(即告诉函数返回内容的部分)应用
:“在设置维度之前,结果由'as.vector'强制为一种基本向量类型”。所以,这就是为什么你得到一个类为
numeric
的向量,而不是
POSIXct
,我不这么认为,因为你有不同的时区。还有其他隐藏循环的方法,例如,
as.POSIXct(矢量化(“charDateToPosixct”)(chrDate,“%m/%d/%y”,时区),origin='1970-01-01')
如果我使用df$date1,这就是
应用的方法。我的结果与你使用你所说的变通方法得到的结果相匹配。问题的第二部分,我说的交替或变通方法是错误的,所以我省略了。抱歉4混淆。从
?在值部分(即告诉函数返回内容的部分)应用
:“在设置维度之前,结果由'as.vector'强制为一种基本向量类型”。所以,这就是为什么你得到一个类为
numeric
的向量,而不是
POSIXct
,我不这么认为,因为你有不同的时区。还有其他隐藏循环的方法,例如,
as.POSIXct(矢量化(“charDateToPosixct”)(chrDate,“%m/%d/%y”,时区),origin='1970-01-01')