【问题标题】:R data frame - row number increasesR数据框 - 行数增加
【发布时间】:2011-10-26 03:01:02
【问题描述】:

假设我们有一个数据框(第三列是日期列),其中包含从 2000 年 1 月到 2011 年 10 月期间对不规则事件的观察。目标是选择数据框中包含两个日期之间观察的那些行

start<-"2005/09/30"
end<-"2011/01/31"  

原始数据框包含大约 21 000 行。我们可以使用 length(df_original$date_column)

我们现在创建一个包含比开始日期新的日期的新数据框:

df_new<-df_original[df_original$date_column>start,]

如果我使用 length(df_new$date_column) 检查长度,它显示的长度约为 13 000。

现在我们创建另一个应用第二个标准(小于结束日期)的数据框:

df_new2<-df_new[df_new$date_column<end,]

如果我再次使用 length(df_new2$date_column) 检查长度,它会显示大约 19 000 个长度计数。

如何通过对新数据框df_new 应用第二个标准来增加行数? df_new 的行数应等于或低于 13 000。

数据框很大,我不能在这里发布。也许有人可以提供发生这种行为的原因。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    以下示例对我来说很好:

    df_original = data.frame(date_column = seq(as.Date('2000/01/01'), Sys.Date(), by=1), value = 1)
    
    start = as.Date('2005/09/30')
    end   = as.Date('2011/01/31')
    
    df_new = df_original[df_original$date_column>start,]
    
    df_new2 = df_new[df_new$date_column<end,]
    
    > dim(df_original)
    [1] 4316    2
    > dim(df_new)
    [1] 2216    2
    > dim(df_new2)
    [1] 1948    2
    

    如果没有看到您的实际数据示例,我建议您注意两件事:

    1. 确保您的日期编码为日期。
    2. 确保您不会意外按行名进行索引。这是您所说的行为的常见罪魁祸首。

    【讨论】:

    • 感谢 dim 命令,它非常有用并且可以节省大量输入。奇怪的行为是由 df_new2 = df_new[df_new$date_column
    • 太好了,我很高兴它整理好了!
    【解决方案2】:

    你能通过一个子集命令得到你想要的结果吗?

    df_new <- df_original[with(df_original, date_column>start & date_column<end),]
    # or
    df_new <- subset(df_original, date_column>start & date_column<end)
    

    【讨论】:

    • 亲爱的约书亚,感谢您的回答。你的两种方法我都试过了。工作很好并产生相同的结果。如果我将变量 start 和 end 定义为字符,它们甚至可以工作。
    【解决方案3】:

    你能给我们dput(head(df_original))吗?它与我们共享前 5 条记录及其数据结构。我怀疑您的date_column 的格式有问题。

    如果您将startend 都存储为字符串(您的示例似乎表明了这一点)并且日期列也是一个字符串,那么您将无法使用&lt;&gt; 来比较日期的值。因此,您需要在某个地方验证被比较的所有内容都被 R 知道为日期。

    【讨论】:

    • 确实需要 dput 输出,但我认为您对 &lt;&gt; 如何与字符一起工作是错误的,JD。如果日期是“字符”并且采用 yyyy-mm-dd 格式,那么 &lt;&gt; 将工作得很好。试试看。 (但不会进行敏感性检查。)“2000-01-01”“1999-01-01”[1] TRUE
    • 好点@DWin。当日期格式为 YYYYMMDD 时,您是完全正确的。
    • 亲爱的詹姆斯,感谢您的回复。由于我必须遵循的限制,我实际上无法提供 (dput(head(df_original)) 但我可以笼统地描述输出。它很大并且以 structure(list(Var_1=c(..then下面是 6 个而不是 5 个示例...对于 Date 列,它显示:class= "Date"。
    猜你喜欢
    • 2022-11-01
    • 2021-06-04
    • 2015-07-28
    • 2020-06-24
    • 2022-01-22
    • 2019-08-19
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多