R 从数据帧中删除行
我有这个R 从数据帧中删除行,r,dataframe,apply,R,Dataframe,Apply,我有这个数据框: set.seed(1) df <- data.frame(id1=LETTERS[sample(26,100,replace = T)],id2=LETTERS[sample(26,100,replace = T)],stringsAsFactors = F) 我想从df中删除df$id1或df$id2不在vec中的任何行 找到满足此条件的行索引是否有比以下更快的方法: rm.idx <- which(!apply(df,1,function(x) all(x %
数据框
:
set.seed(1)
df <- data.frame(id1=LETTERS[sample(26,100,replace = T)],id2=LETTERS[sample(26,100,replace = T)],stringsAsFactors = F)
我想从df
中删除df$id1
或df$id2
不在vec
中的任何行
找到满足此条件的行索引是否有比以下更快的方法:
rm.idx <- which(!apply(df,1,function(x) all(x %in% vec)))
rm.idx在列上循环可能比在行上循环快。因此,使用lappy
在列上循环,使用%in%
创建逻辑向量的列表,使用Reduce
和|
检查每个对应行是否有任何真值,并使用该值对“df”进行子集划分
df[Reduce(`|`, lapply(df, `%in%`, vec)),]
如果我们需要这两个元素,则将|
替换为&
df[Reduce(`&`, lapply(df, `%in%`, vec)),]
在列上循环可能比在行上循环快。因此,使用lappy
在列上循环,使用%in%
创建逻辑向量的列表,使用Reduce
和|
检查每个对应行是否有任何真值,并使用该值对“df”进行子集划分
df[Reduce(`|`, lapply(df, `%in%`, vec)),]
如果我们需要这两个元素,则将|
替换为&
df[Reduce(`&`, lapply(df, `%in%`, vec)),]
实际上
rm.idx <- unique(which(!(df$id1 %in% vec) | !(df$id2 %in% vec)))
rm.idx实际上
rm.idx <- unique(which(!(df$id1 %in% vec) | !(df$id2 %in% vec)))
rm.idx我在这样的脚本中使用了dplyr
df1 <- df %>% filter(!(df$id1 %in% vec)|!(df$id2 %in% vec))
df1%过滤器(!(df$id1%在%vec中)|!(df$id2%在%vec中))
我在这样的脚本中使用了dplyr
df1 <- df %>% filter(!(df$id1 %in% vec)|!(df$id2 %in% vec))
df1%过滤器(!(df$id1%在%vec中)|!(df$id2%在%vec中))
如果您只有这两个元素要检查,哪个(!(df$id1%in%vec和df$id2%in%vec))
如果您只有这两个元素要检查,哪个(!(df$id1%in%vec和df$id2%in%vec))
您不需要将其包装在unique
其中
将为您提供满足条件的行号索引(设计上是唯一的),您不需要将其包装在唯一的
<代码>它将为您提供符合条件的行号索引(设计上是唯一的)