我需要创建一个"标志"我的主数据框中的列,用于标记日期在特定时间范围内的行。该时间范围来自第二个数据帧。我想我只是坚持ifelse(或if)语句,因为flag列中有NA。也许ifelse不是要走的路。这是一些示例数据:
# main data frame
date <- seq(as.Date("2014-07-21"), as.Date("2014-09-11"), by = "day")
group <- letters[1:4]
datereps <- rep(date, length(group))
groupreps <- rep(group, each = length(date))
value <- rnorm(length(datereps))
df <- data.frame(Date = datereps, Group = groupreps, Value = value)
# flag time period data frame
flag <- data.frame(Group = c("b", "d"),
start = c("2014-08-01", "2014-08-26"),
end = c("2014-08-11", "2014-09-01"))
# Merge flag dates into main data frame
df2 <- merge(df, flag, by = "Group", all.x = T)
# Execute ifelse statement on each row
df2$flag <- "something"
df2$flag <- ifelse(df2$Date >= as.Date(df2$start) & df2$Date <= as.Date(df2$end), "flag", "other")
结果是在&#34;开始&#34;的行中和&#34;结束&#34;指定日期,&#34;标记&#34;和&#34;其他&#34;被标记,但在哪里&#34;开始&#34;和&#34;结束&#34;是NA,我得到df2$flag
的Na值。即使我使用df2$flag
发起"something"
,也会发生这种情况。对于未定义为"other"
的所有值,我希望"flag"
。看看行50:68。
df2[50:68,]
答案 0 :(得分:0)
如果我这样做,我会跳过中间数据帧(df2
)和合并步骤,并使用ifelse和|
,这意味着OR。
date <- seq(as.Date("2014-07-21"), as.Date("2014-09-11"), by = "day")
group <- letters[1:4]
datereps <- rep(date, length(group))
groupreps <- rep(group, each = length(date))
value <- rnorm(length(datereps))
df <- data.frame(DateTime = datereps, Group = groupreps, Value = value)
这会将flag
应用于您指定的条件:
df$flag <- ifelse(df$DateTime >= as.Date("2014-08-01") & df$DateTime <= "2014-08-11" |
df$DateTime >= as.Date("2014-08-26") & df$DateTime <= "2014-09-01",
"flag", "other")
然后你可以看看:
df[df$flag=="flag",]
答案 1 :(得分:0)
将您的最后一行更改为:
for (i in 1:nrow(df2)) {
if (is.na(df2$start[i])) {
df2$flag[i] = 'other'
} else if (df2$Date[i] >= as.Date(df2$start[i]) & df2$Date[i] <= as.Date(df2$end[i])) {
df2$flag[i] = "flag"
} else {
df2$flag[i] = "other"
}
}
它的丑陋却完成了它的工作。此代码未进行矢量化,因此适用于您的情况,但对于较大的应用程序来说速度较慢。