消除数据表中的选定行

时间:2018-04-26 02:55:10

标签: r data.table

我正在尝试根据两列的值删除一行数据表,但没有运气。

我尝试了在其他线程中找到的两个代码:

my.data.table[!(my.data.table[,1]==6557 & my.data.table[,2]=="31-Dec-82"),] 
  ###var1 is in column 1 and var2 is in column 2

my.data.table %>% filter(var1!= 6557 & var2!="31-Dec-82")

但没有效果。请注意,var1是数字,var2是字符(现在不是日期)。 我可以做的唯一方法是手动查找行号

my.data.table<-my.data.table[-rownumber] 

但这在1M行表中不太方便,即使已排序。

知道为什么我不能让它发挥作用吗?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您想删除 var1 == 6447 var2 == "31-Dec-82"的行。这相当于否定了逻辑表达式var1 == 6557 & var2 == "31-Dec-82"

使用dplyr::filter

的方法
# Sample data
df <- data.frame(
    var1 = 6556:6558,
    var2 = c("31-Dec-82", "31-Dec-82", "30-Dec-82")
)

df %>% filter(!(var1 == 6557 & var2 == "31-Dec-82"))
#  var1      var2
#1 6556 31-Dec-82
#2 6558 30-Dec-82

使用基础R subset

的方法
subset(df, !(var1 == 6557 & var2 == "31-Dec-82"))
#  var1      var2
#1 6556 31-Dec-82
#3 6558 30-Dec-82

答案 1 :(得分:1)

因为它是data.table

my.data.table[,1]

不会像data.frame中那样对列进行子集化。可以使用vector

将列值提取为[[
my.data.table[[1]]

my.data.table[!(my.data.table[[1]]==6557 & my.data.table[[2]] =="31-Dec-82"),] 

或指定列的名称

my.data.table[!(var1==6557 & var2 =="31-Dec-82")] 

对data.table列进行子集化的另一个选项是指定with = FALSE

my.data.table[, 1, with = FALSE]

但这将返回单个列data.table而不是vector