2015-11-02 118 views
1

說我有分配給列一個DataTabledata.table:列名匹配

> dt = data.table(Faaa = c(1,2,NA), Fbbb = c(2,NA,3), date = as.IDate(c("2010-01-01", "2010-01-02", NA))) 
> dt 
    Faaa Fbbb  date 
1: 1 2 2010-01-01 
2: 2 NA 2010-01-02 
3: NA 3  <NA> 

假設有很多與F.我想開頭的名字列,其名稱開頭帶有F每一列,用列平均值來計算NA,但不包括日期(和任何其他)列。

對於這個問題,F列是彼此相鄰的,所以我可以通過索引訪問,只是想知道是否有一個聰明的方法,以便我不需要硬編碼列索引。

回答

2

您可以使用grepna.aggregatezoo這個:

library(data.table) 
library(zoo) 

dt <- data.table(Faaa = c(1,2,NA), Fbbb = c(2,NA,3), date = as.IDate(c("2010-01-01", "2010-01-02", NA))) 

dt[, grep("^F", names(dt), value = TRUE) := lapply(.SD, na.aggregate),.SDcols = grep("^F", names(dt), value = TRUE), with = FALSE] 

這導致:

Faaa Fbbb  date 
1: 1.0 2.0 2010-01-01 
2: 2.0 2.5 2010-01-02 
3: 1.5 3.0  <NA>