【问题标题】:Remove rows between two specific rows删除两个特定行之间的行
【发布时间】:2019-11-13 07:07:05
【问题描述】:

我有一个关于删除特定行的小问题。 在此示例中,我想从“power”列中的单词“5055”中删除行,直到“fr”列中的单词“Exer”。 重要的是,我想在两个 id 中应用这个函数(这里是 LM01-PRD-S1 和 LB02-PRD-S1)。

                   time   power        hr     fr          id

 1                  <NA>  5055       Zoti      E LM01-PRD-S1
 2              747 mmHg  <NA>       09/0   2016 LM01-PRD-S1
 3 9.7222222222222224E-3     0         76     20 LM01-PRD-S1
 4  2.013888888888889E-2     0         77     16 LM01-PRD-S1
 5 2.9861111111111113E-2     0         77     17 LM01-PRD-S1
 6                  <NA>  <NA>       <NA>   Exer LM01-PRD-S1
 7 1.0416666666666666E-2    25         90     24 LM01-PRD-S1
 8 1.9444444444444445E-2    25         92     23 LM01-PRD-S1
 9 3.0555555555555555E-2    25         93     22 LM01-PRD-S1
10                  <NA>  5055       Zoti      E LB02-PRD-S1
11              750 mmHg  <NA>       11/0   2016 LB02-PRD-S1
12 8.3333333333333332E-3     0         81     14 LB02-PRD-S1
13 1.6666666666666666E-2     0         96     15 LB02-PRD-S1
14 2.8472222222222222E-2     0         71     14 LB02-PRD-S1
15                  <NA>  <NA>       <NA>   Exer LB02-PRD-S1
16 1.0416666666666666E-2    35        102     16 LB02-PRD-S1
17 1.9444444444444445E-2    35        101     17 LB02-PRD-S1
18 3.0555555555555555E-2    35        105     15 LB02-PRD-S1

我试过这个功能,但我删除了第 1 到 15 行,而我只想删除第 1 到 6 行和第 10 到 15 行。

df[-c(min(grep("5055",df[,power])):max(grep("Exer",df[,fr]))),]

这是我想要得到的最终结果。

                   time power    hr    fr          id
1 1.0416666666666666E-2    25    90    24 LM01-PRD-S1
2 1.9444444444444445E-2    25    92    23 LM01-PRD-S1
3 3.0555555555555555E-2    25    93    22 LM01-PRD-S1
4 1.0416666666666666E-2    35   102    16 LB02-PRD-S1
5 1.9444444444444445E-2    35   101    17 LB02-PRD-S1
6 3.0555555555555555E-2    35   105    15 LB02-PRD-S1

我希望我解释得很好。 感谢您的帮助!

【问题讨论】:

  • 这两个词是否唯一,即每个词只出现一次?您可以在问题中添加示例数据吗?
  • 我刚刚编辑了问题并添加了一个示例。
  • 请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 我根据可复制的示例更新了我的问题。我希望它现在更好,更容易理解。谢谢。

标签: r


【解决方案1】:

这里有一个解决方案。它绝对不是最优雅的,但它正在发挥作用。

1) 定义每个目标 5055 和 Exer 的位置

vec5055 = grep("5055",df[,"power"])
vecExer = grep("Exer",df[,"fr"])

然后,我们将创建一个新向量 VEC,它将包含我们想要删除的所有行,我们将应用于数据框 df

if(length(vec5055) == length(vecExer)){
  VEC = NULL
  for(i in 1:length(vec5055))
  {
    VEC = c(VEC,vec5055[i]:vecExer[i])
  }
  df = df[-VEC,]
}

你应该得到你期望的数据集。 我确信它存在其他更简单的解决方案,但目前它是我唯一想到的。

让我知道你是否合适

【讨论】:

  • 感谢您的帮助。我想指定单词(此处为“地址”和“练习”)以供参考。
  • 我正在考虑使用 grep 函数,但我无法使用它。 “地址”和“练习”这两个词在同一列中重复了多次
  • @MaxB,我不确定这是否会起作用,因为 addressexercise 在您的数据框中出现两次,因此 R 将如何知道您要删除哪些行。此外,当您在 R (View(name_of_your_dataframe) 中打开数据框时,您的图像是否是您获得的?它看起来像一个 excel 表,我认为您的数据框一旦在 R 中打开后将不会具有相同的结构。我认为您真的应该尝试发布reproducible example
  • 是的,我希望 R 删除这两个单词之间的每一行(“地址”作为第一个,“锻炼”作为第二个),即使它出现两次或更多次。我刚刚使用了 Excel 表格的打印屏幕,我对使用 R 非常陌生。谢谢。
  • 我编辑了我的代码以向您提出解决方案,但您确实应该在 R 中(而不是在 Excel 中)提供数据集的输出(如果您不提供,至少在 Rstudio 中提供数据集的打印屏幕知道如何在控制台中打印)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
相关资源
最近更新 更多