R:将缺失值的列添加到数据框中
问题描述:
我正在使用财务数据,并且我的主数据框的行名称是日期。R:将缺失值的列添加到数据框中
> 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 $接近资产)从数据帧是同一类型,但一些日期丢失:
> 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
但我不能这样做的列。
答
您可以使用合并方法。
我认为你使用的是xts时间序列对象。这些自动处理行名称。从help(merge.xts)
,您可以使用关键字参数加入来控制合并的发生方式。它默认为'外部'。例如:
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
答
你可以填补他们在第一,然后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'
结果:因为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 NA
2003-01-07 48.1 23.98 23.5 23 22.34 518
排序as.POSIXct(row.names(..))
是很重要的。没有它,我们会得到
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
我不认为这是OP所寻找的。问题是行名仍然被忽略。 (请参阅我的回答中的最后一条评论) –
我刚刚找到我需要的东西:dat Lemko
@Robert Krzyzanowski谢谢 - 我更新了回复,以明确合并xts对行名进行操作(必须是日期)。 – slushy