我正在尝试根据两列的值删除一行数据表,但没有运气。
我尝试了在其他线程中找到的两个代码:
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行表中不太方便,即使已排序。
知道为什么我不能让它发挥作用吗?
答案 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
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