替换与数据框中匹配的选择列中的值

卡拉姆·钱德(Karam Chand)

我正在尝试将所有与日期和DOB匹配的列名的默认“ 1900-01-01”替换为na值。下面是代码。

library(dplyr)

data[is.na(data),] %>% select(matches("date"),DOB) %>% head()

FirstTradeDate LastTradeDate DOB
NA <NA> <NA> <NA>
NA.1 <NA> <NA> <NA>
NA.2 <NA> <NA> <NA>
NA.3 <NA> <NA> <NA>
NA.4 <NA> <NA> <NA>
NA.5 <NA> <NA> <NA>

是否可以用dplyr软件包代替?我试过mutate和transmutate都无法正常工作。任何的想法?

我也试过了

data[is.na(data),c(grep("[Dd]ate|DOB",names(data)))]<-as.Date("1970-01-01")

Error in `[<-.data.frame`(`*tmp*`, is.na(data), c(grep("[Dd]ate|DOB",  : 
  non-existent rows not allowed

traceback()

3: stop("non-existent rows not allowed")
2: `[<-.data.frame`(`*tmp*`, is.na(data), c(grep("[Dd]ate|DOB", 
       names(data))), value = 0)
1: `[<-`(`*tmp*`, is.na(data), c(grep("[Dd]ate|DOB", names(data))), 
       value = 0)

还有其他方法吗?

阿克伦

你可以用 base R

indx <- grep('DOB|Date', colnames(dat1))
dat1[indx][dat1[indx]=='1900-01-01'] <- NA
head(dat1)
#  FirstTradeDate LastTradeDate        DOB        Val
#1     1900-01-03          <NA> 1900-01-04  0.8804658
#2           <NA>    1900-01-03 1900-01-05 -1.6254185
#3     1900-01-02    1900-01-02       <NA> -0.3863661
#4     1900-01-04    1900-01-05       <NA>  0.6196153
#5           <NA>    1900-01-03       <NA> -1.1075294
#6     1900-01-05    1900-01-04 1900-01-03 -0.9048846

或使用 data.table

library(data.table) 
DT <- setDT(dat1)[, lapply(.SD, function(x) replace(x,
                       x=='1900-01-01', NA)), .SDcols=indx]

或使用 dplyr

library(dplyr)
dat1 %>%
   mutate_each(funs(replace(., .=='1900-01-01', NA)),matches('Date'), DOB)  %>%
   head()
#  FirstTradeDate LastTradeDate        DOB        Val
#1     1900-01-03          <NA> 1900-01-04  0.8804658
#2           <NA>    1900-01-03 1900-01-05 -1.6254185
#3     1900-01-02    1900-01-02       <NA> -0.3863661
#4     1900-01-04    1900-01-05       <NA>  0.6196153
#5           <NA>    1900-01-03       <NA> -1.1075294
#6     1900-01-05    1900-01-04 1900-01-03 -0.9048846

更新

data.table方法也可以在loop(如@Arun所提到的)中完成

   nm1 <- names(dat1)[indx]
   DT <- data.table(dat1)
   for(nm in nm1){
     setkeyv(DT, nm)
     DT[J(as.Date('1900-01-01')), (nm):=NA]
   }

或者for-loop与一起使用set

require(data.table)
indx = grep("DOB|Date", names(dat1), value=TRUE)
setDT(dat1)
for (j in indx) {
    thiscol = dat1[[j]]
    set(dat1, i = which(thiscol == "1900-01-01"), j = j, value = NA)
}

数据

Dates <- seq(as.Date('1900-01-01'), length.out=5, by='1 day')
set.seed(248)
dat1 <- data.frame(FirstTradeDate=sample(Dates,100,replace=TRUE),
  LastTradeDate=sample(Dates,100, replace=TRUE), DOB=sample(Dates,100,
     replace=TRUE), Val=rnorm(100))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章