【问题标题】:Subsetting rows of data frame by charater patterns (grepl) in a for loop [duplicate]在for循环中通过字符模式(grepl)对数据帧的行进行子集[重复]
【发布时间】:2020-08-03 15:33:50
【问题描述】:

我试图通过删除包含某些字符模式的行来对数据帧进行子集化,这些字符模式存储在向量中。我的问题是只从我的数据框中删除了向量的最后一个模式。如何让我的循环迭代地工作,以便从我的数据框中删除存储在向量中的所有模式?

模拟输入:

df<-data.frame(organism=c("human_longname","cat_longname","bird_longname","virus_longname","bat_longname","pangolian_longname"),size=c(6,4,2,1,3,5))
df
   organism            size
1     human_longname     6
2       cat_longname     4
3      bird_longname     2
4     virus_longname     1
5       bat_longname     3
6 pangolian_longname     5

使用的代码和输出:

vectors<-c("bat","virus","pangolian")
for(i in vectors){df_1<-df[!grepl(i,df$organism),]}
df_1
  organism             size
1    human_longname      6
2      cat_longname      4
3     bird_longname      2
4    virus_longname      1
5      bat_longname      3

预期输出

df_1
  organism             size
1    human_longname      6
2      cat_longname      4
3     bird_longname      2

【问题讨论】:

  • 试试这个:df[!df$organism %in% c("bat","virus","pangolian"),]
  • ... 或:subset(df, !organism %in% vectors)
  • 非常感谢大家。我更喜欢这些优雅的解决方案。但是,我仍然很想知道如何使用 for 循环实现这一点:)
  • 对不起,伙计们。我忘了提到我必须按模式进行子集化,因为我在数据框中的字符串很长。我将更改为模拟数据以更好地显示这一点。不过非常感谢您的回答。
  • @RikkiFranklinFrederiksen 我已经更新了使用新数据的解决方案。如果你喜欢,请检查。

标签: r dataframe for-loop


【解决方案1】:

你可以试试这个:

df[!df$organism %in% c("bat","virus","pangolian"),]

  organism size
1    human    6
2      cat    4
3     bird    2

更新:基于新数据,这里使用grepl() 的方法。这些函数可用于避免循环:

#Vectors
vectors<-c("bat","virus","pangolian")
#Format
vectors2 <- paste0(vectors,collapse = '|')
#Avoid loop
df[!grepl(pattern = vectors2,df$organism),]

        organism size
1 human_longname    6
2   cat_longname    4
3  bird_longname    2

也只是出于好奇,这里可能不是最佳循环来执行创建新数据框和索引的相同任务:

#Create index
index <- c()
#Loop
for(i in 1:dim(df)[1])
{
  if(grepl(vectors2,df$organism[i])==F) 
  {
    index <- c(index,i)
  }
  ndf <- df[index,]
}

ndf

        organism size
1 human_longname    6
2   cat_longname    4
3  bird_longname    2

【讨论】:

  • 有效!非常感谢鸭子。这似乎是一项简单的任务,但我已经为此苦苦挣扎了几个小时,尝试使用 for 循环和 apply() 函数无济于事。
  • @RikkiFranklinFrederiksen 太棒了! R 中的大多数函数都像 grepl 一样被矢量化,因此您可以避免循环 :)
  • @RikkiFranklinFrederiksen 出于好奇,我添加了使用循环执行任务的方法,与其他解决方案相比,这可能不是最佳的,但您可以检查一下。
  • 感谢您向我展示 Duck。你的第一个解决方案对我来说肯定更容易掌握:)。
  • @RikkiFranklinFrederiksen 完全同意你的看法:)
猜你喜欢
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2019-01-02
  • 1970-01-01
  • 2020-11-30
  • 2019-11-10
相关资源
最近更新 更多