【问题标题】:Drop rows in R based on conditions根据条件删除 R 中的行
【发布时间】:2020-09-02 23:49:55
【问题描述】:

我是 R 和堆栈溢出的新手,所以请多多包涵,因为我正在尽力在这里描述我的问题。如果满足某些条件,我想删除数据框的某些行。访问数据框:

Time <- c(5.58, 12.79, 14.27, 14.35, 18.18, 19.62, 20.69, 20.70, 20.80, 22.65)
Signal <- c(532.0603, 290.8152, 390.9111, 778.8482, 541.6486, 855.9310, 445.0463, 887.9447, 889.1131, 490.0643)
data.frame(Time, Signal)
  Time   Signal
  5.58 532.0603
 12.79 290.8152
 14.27 390.9111
 14.35 778.8482
 18.18 541.6486
 19.62 855.9310
 20.69 445.0463
 20.70 887.9447
 20.80 889.1131
 22.65 490.0643

我想做的第一件事是如果时间 A 在时间 B 的 0.2 以内并且信号 B 不大于信号 A 的 2,然后删除 Row B. 所以我的预期结果是

  Time   Signal
  5.58 532.0603
 12.79 290.8152
 14.27 390.9111
 14.35 778.8482
 18.18 541.6486
 19.62 855.9310
 20.69 445.0463
 20.70 887.9447
 22.65 490.0643

第二件事是如果时间 A 在时间 B 的 0.2 以内 并且 abs((信号 B + 2)/2 - 信号 A)

  Time   Signal
  5.58 532.0603
 12.79 290.8152
 14.35 778.8482
 18.18 541.6486
 19.62 855.9310
 20.70 887.9447
 22.65 490.0643

我的想法是我可能必须编写一个带有 while 循环的函数,但不确定这是否是正确的方法或如何执行。实际上,我已经花了很多时间试图弄清楚这一点,如果您能帮助我,我将非常感谢您的帮助,非常感谢!!!

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 行“A”是第一行,对吧?
  • 是的@Edward,A 行是第一行,B 行是下一行。

标签: r dplyr data-cleaning


【解决方案1】:

您可以使用以下代码:

我们可以使用LeadLag函数分别引用下一行或上一行。

data %>% 
  mutate(Timediff = Time - lag(Time), SignalDiff = Signal - lag(Signal)) %>%
  filter(Timediff >0.2 | SignalDiff >=2| is.na(Timediff)) %>% 
  mutate(Timediff = lead(Time) - Time, SignalDiff = lead(Signal)-Signal) %>%
  filter(Timediff >0.2 |  abs((lead(Signal) + 2)/2 - Signal) >1|is.na(SignalDiff)) %>% 
  dplyr::select(Time, Signal)

   Time   Signal
1  5.58 532.0603
2 12.79 290.8152
3 14.35 778.8482
4 18.18 541.6486
5 19.62 855.9310
6 20.70 887.9447
7 22.65 490.0643

【讨论】:

  • 非常感谢您的帮助! Lead 和 Lag 在这里是非常出色的工具。简单但功能强大。真的很感激!
  • @Ben 你能告诉我们你做了什么改变吗?有什么我错过的吗?提前致谢。
  • 不——一切都好。只需在每个管道后添加换行符以提高可读性,仅此而已。
猜你喜欢
  • 2021-12-08
  • 2018-10-04
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2020-06-10
  • 2017-09-12
  • 2021-02-24
  • 2018-03-03
相关资源
最近更新 更多