创建列以标记R中日期时段内的行

时间:2017-02-28 18:55:47

标签: r if-statement

我需要创建一个"标志"我的主数据框中的列,用于标记日期在特定时间范围内的行。该时间范围来自第二个数据帧。我想我只是坚持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,]

2 个答案:

答案 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"
    }
}

它的丑陋却完成了它的工作。此代码未进行矢量化,因此适用于您的情况,但对于较大的应用程序来说速度较慢。