gpt4 book ai didi

r - 在 ddply 中使用 ifelse 和转换

转载 作者:行者123 更新时间:2023-12-04 11:36:47 27 4
gpt4 key购买 nike

我正在尝试使用 ddplytransform使用变量 summary_Date 在数据框中填充新变量 ( ID )和 Date .变量的值是根据使用 ifelse 评估的片段的长度选择的。 :

如果给定月份中某个 ID 的观察值少于五个,我想要 summary_Date通过将日期四舍五入到最近的月份来计算(使用 round_date 来自包 lubridate );如果给定月份中某个 ID 的观察值超过五个,我想要 summary_Date简单地成为 Date .

require(plyr)
require(lubridate)

test.df <- structure(
list(ID = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1
, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2)
, Date = structure(c(-247320000, -246196800, -245073600, -243864000
, -242654400, -241444800, -126273600, -123595200
, -121176000, -118497600, 1359385200, 1359388800
, 1359392400, 1359396000, 1359399600, 1359403200
, 1359406800, 1359410400, 1359414000, 1359417600
, 55598400, 56116800, 58881600, 62078400, 64756800
, 67348800, 69854400, 72964800, 76161600, 79012800
, 1358589600, 1358676000, 1358762400, 1358848800
, 1358935200, 1359021600, 1359108000, 1359194400
, 1359280800, 1359367200), tzone = "GMT"
, class = c("POSIXct", "POSIXt"))
, Val=rnorm(40))
, .Names = c("ID", "Date", "Val"), row.names = c(NA, 40L)
, class = "data.frame")

test.df <- ddply(test.df, .(ID, floor_date(Date, "month")), transform
, summary_Date=as.POSIXct(ifelse(length(ID)<5
, round_date(Date, "month")
,Date)
, origin="1970-01-01 00:00.00"
, tz="GMT")
# Included length_x to easily see the length of the subset
, length_x = length(ID))

head(test.df,5)
# floor_date(Date, "month") ID Date Val summary_Date length_x
# 1 1962-03-01 1 1962-03-01 12:00:00 -0.1037988 1962-03-01 3
# 2 1962-03-01 1 1962-03-14 12:00:00 0.2923056 1962-03-01 3
# 3 1962-03-01 1 1962-03-27 12:00:00 0.4435410 1962-03-01 3
# 4 1962-04-01 1 1962-04-10 12:00:00 0.1159164 1962-04-01 2
# 5 1962-04-01 1 1962-04-24 12:00:00 2.9824075 1962-04-01 2
ifelse语句似乎有效,但 'summary_Date' 中的值似乎是为转换正在处理的子集计算的第一个值,而不是特定于行的值。例如在第 3 行, summary_Date应该是 1962-04-01因为日期 1962-03-27 12:00:00'应该四舍五入(因为子集中少于五行),而是取第一个计算值 summary_Date ( 1962-03-01 ) 在该子集中的所有行中重复。

编辑:我的灵感来自 Ricardo 使用 data.table 的回答用 ddply 分两步试试.它也有效:
test.df <- ddply(test.df, .(ID, floor_date(Date, "month")), transform
, length_x = length(ID))

test.df <- ddply(test.df, .(ID, floor_date(Date, "month")), transform
, summary_Date=as.POSIXct(ifelse(length_x<5
, round_date(Date, "month")
,Date)
, origin="1970-01-01 00:00.00"
, tz="GMT"))

head(test.df,5)[c(1,3:7)]
# floor_date(Date, "month") ID Date Val length_x summary_Date
# 1 1962-03-01 1 1962-03-01 12:00:00 -0.1711212 3 1962-03-01
# 2 1962-03-01 1 1962-03-14 12:00:00 -0.1531571 3 1962-03-01
# 3 1962-03-01 1 1962-03-27 12:00:00 0.1256238 3 1962-04-01
# 4 1962-04-01 1 1962-04-10 12:00:00 1.4481225 2 1962-04-01
# 5 1962-04-01 1 1962-04-24 12:00:00 -0.6508731 2 1962-05-01

最佳答案

一步ddply解决方案(也作为评论发布)

ddply(test.df, .(ID, floor_date(Date, "month")), mutate, 
length_x = length(ID),
summary_Date=as.POSIXct(ifelse(length_x < 5, round_date(Date, "month") ,Date)
, origin="1970-01-01 00:00.00", tz="GMT")
)

关于r - 在 ddply 中使用 ifelse 和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15164759/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com