使用特定列中的NA删除R data.table中的行

时间:2017-05-13 21:25:24

标签: r dataframe dplyr magrittr

我有一个包含大量功能的data.table。我想删除仅针对某些功能的值为NAs的行。

目前我正在使用以下方法处理此问题:

data.joined.sample <- data.joined.sample  %>% 
  filter(!is.na(lat))   %>% 
  filter(!is.na(long))   %>% 
  filter(!is.na(temp))   %>% 
  filter(!is.na(year))   %>% 
  filter(!is.na(month))   %>% 
  filter(!is.na(day))   %>% 
  filter(!is.na(hour))   %>% 
.......

有没有更简洁的方法来实现这一目标?

str(data.joined.sample)
Classes ‘data.table’ and 'data.frame':  336776 obs. of  50 variables:

2 个答案:

答案 0 :(得分:2)

我们可以选择这些列,使用vector根据它获取NA的逻辑complete.cases并使用它来删除NA元素

data.joined.sample[complete.cases(data.joined.sample[colsofinterest]),]

其中

colsofinterest <- c("lat", "long", "temp", "year", "month", "day", "hour")

更新

根据OP的评论,如果是data.table,则将colsofinterest分组并使用complete.cases

data.joined.sample[complete.cases(data.joined.sample[, colsofinterest, with = FALSE])]

答案 1 :(得分:1)

data.table - 对象,如果这实际上与你合作,对于“[”函数有一些不同的语法。查看此控制台会话:

> DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
> DT[x=="a"&y==1]
   x y v
1: a 1 4
> is.na(DT[x=="a"&y==1]$v) <- TRUE # make one item NA
> DT[x=="a"&y==1]
   x y  v
1: a 1 NA
> DT
   x y  v
1: b 1  1
2: b 3  2
3: b 6  3
4: a 1 NA
5: a 3  5
6: a 6  6
7: c 1  7
8: c 3  8
9: c 6  9
> DT[complete.cases(DT)]  # note no comma
   x y v
1: b 1 1
2: b 3 2
3: b 6 3
4: a 3 5
5: a 6 6
6: c 1 7
7: c 3 8
8: c 6 9
>  DT   # But that didn't remove the NA, it only gave a value
   x y  v
1: b 1  1
2: b 3  2
3: b 6  3
4: a 1 NA
5: a 3  5
6: a 6  6
7: c 1  7
8: c 3  8
9: c 6  9
> DT <- DT[complete.cases(DT)]  # do this assignment to make permanent
> DT
   x y v
1: b 1 1
2: b 3 2
3: b 6 3
4: a 3 5
5: a 6 6
6: c 1 7
7: c 3 8
8: c 6 9

可能不是真正的“data.table方式”。