【问题标题】:R : add a column with missing values to a dataframeR:向数据框中添加缺少值的列
【发布时间】:2014-06-03 02:56:25
【问题描述】:

我正在使用财务数据,我的主要数据框的行名是日期。

   > assets[1:3,1:5]
            ALD   SFN  TCO KIM   CTX
2003-01-03 48.1 23.98 23.5  23 22.34
2003-01-06 48.1 23.98 23.5  23 22.34
2003-01-07 48.1 23.98 23.5  23 22.34

我想从相同类型但缺少某些日期的数据框中添加一列(这里我想将 FOC$close 添加到资产):

   > FOC[1:3,1:2]
           Close Adj.Close
2003-01-03   510       510
2003-01-07   518       518

缺失的值应该只是 NA,所以看起来像这样:

   > assets[1:3,1:6]
            ALD   SFN  TCO KIM   CTX FOC
2003-01-03 48.1 23.98 23.5  23 22.34 510
2003-01-06 48.1 23.98 23.5  23 22.34 NA
2003-01-07 48.1 23.98 23.5  23 22.34 518

有什么好的方法吗?我设法通过做类似的事情对行做类似的事情

> rowtoadd <- list(ALD=18.1,...)
> dataframe[nrow(dataframe) + 1, names(rowtoadd)] <- rowtoadd

但我无法为列执行此操作。

【问题讨论】:

    标签: r merge dataframe missing-data


    【解决方案1】:

    您可以使用合并方法。

    我认为您正在使用 xts 时间序列对象。这些会自动处理行名。从help(merge.xts) 开始,有一个关键字参数join,您可以使用它来控制合并的发生方式。它默认为“外部”。示例:

    dat = merge(assets[1:3,], FOC[,1:2], join='left')
    > dat
                ALD   SFN  TCO KIM   CTX Close Adj.Close
    2003-01-03 48.1 23.98 23.5  23 22.34   510       510
    2003-01-06 48.1 23.98 23.5  23 22.34    NA        NA
    2003-01-07 48.1 23.98 23.5  23 22.34   518       518
    

    【讨论】:

    • 我认为这不是 OP 想要的。问题是行名仍然被忽略。 (请参阅我回答中的最后一条评论)
    • 我刚刚找到了我需要的东西:dat
    • @Robert Krzyzanowski 谢谢——我更新了回复,明确表示 xts 的合并对行名(必须是日期)进行操作。
    【解决方案2】:

    你可以先填写,然后cbind:

    # Example data
    df <- data.frame(list(split(rep(c(48.1, 23.98, 23.5, 23, 22.34), each = 3), rep(1:5, each = 3))))
    colnames(df) <- c('ALD', 'SFN', 'TCO', 'KIM', 'CTX')
    row.names(df) <- paste0('2003-01-0', c(3, 6, 7))
    df <- df[order(as.POSIXct(row.names(df))), ] # This is important for cbind to work right
    FOC <- data.frame(Close = c(510, 518), Adj.Close = c(510, 518))
    row.names(FOC) <- paste0('2003-01-0', c(3, 7))
    
    # Fill in NAs
    FOC[setdiff(row.names(df), row.names(FOC)), ] <- NA
    df <- cbind(df, FOC[order(as.POSIXct(row.names(FOC))), 1])
    colnames(df)[length(df)] <- 'FOC'
    

    结果:

                ALD   SFN  TCO KIM   CTX FOC
    2003-01-03 48.1 23.98 23.5  23 22.34 510
    2003-01-06 48.1 23.98 23.5  23 22.34 NA
    2003-01-07 48.1 23.98 23.5  23 22.34 518
    

    按as.POSIXct(row.names(..)) 排序很重要,因为cbind 不检查。没有它,我们会得到

                ALD   SFN  TCO KIM   CTX FOC
    2003-01-03 48.1 23.98 23.5  23 22.34 510
    2003-01-06 48.1 23.98 23.5  23 22.34 518
    2003-01-07 48.1 23.98 23.5  23 22.34 NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2018-06-11
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多