r - R如何根据以下行中的条件过滤数据框?
问题描述
我有一个如下所示的数据框:
a<-c(1,1,-1,1,-1,1,-1,1,1,1,1)
b<-c(100,200,50,100,78,45,78,34,56,32,45)
c<-c(3,2,4,1,3,2,1,3,5,1,2)
d<-c(3400,3403,3407,3408,3412,3423,3436,3245,3234,3456,2345)
df<-cbind(a,b,c,d)
df
a b c d
[1,] 1 100 3 3400
[2,] 1 200 2 3403
[3,] -1 50 4 3407
[4,] 1 100 1 3408
[5,] -1 78 3 3412
[6,] 1 45 2 3423
[7,] -1 78 1 3436
[8,] 1 34 3 3245
[9,] 1 56 5 3234
[10,] 1 32 1 3456
[11,] 1 45 2 2345
其中包含更多行。我想按以下方式过滤:如果列 c = 3,我正在寻找以下行,这些行与我的 c=3 列具有相同的 a 和 b 列值,c 列值必须为 1 并且介于两者之间行在 d 列中必须有 < 10 的差异。
因此,在提供的示例中,输出应为:
a b c d
[1,] 1 100 3 3400
[4,] 1 100 1 3408
由于 a 和 b 列具有相同的值,因此 c 列的值是 3,后跟 1,d 值之间的差值小于 10。例如,
a b c d
[5,] -1 78 3 3412
[7,] -1 78 1 3436
不应包含在输出中,因为在 d 列中,值之间的差异大于 10。
有没有可能实现它?抱歉,如果这是一个愚蠢的问题,我对 R 很陌生。
编辑:新数据框:
a b c d
[1,] 1 100 1 3400
[2,] 1 200 2 3403
[3,] -1 50 4 3407
[4,] 1 100 3 3408
[5,] -1 78 3 3412
[6,] 1 45 2 3423
[7,] -1 78 1 3436
[8,] -1 34 3 3445
[9,] 1 56 5 3234
[10,] -1 34 1 3454
[11,] 1 45 2 3645
期望的结果:
[8,] -1 34 3 3445
[10,] -1 34 1 3454
仅应考虑第一行的 c 列 = 3 的对,而不是第一行的 c 列条目 = 1 而第二行的条目 = 3 的情况。
解决方案
我们可以转换为 data.frame 然后做一个 group byfilter
library(dplyr)
df %>%
filter(c %in% c(3, 1)) %>%
group_by(a, b) %>%
filter(first(c) == 3, any(diff(d) < 10)) %>%
ungroup
# A tibble: 2 x 4
# a b c d
# <dbl> <dbl> <dbl> <dbl>
#1 1 34 3 3445
#2 1 34 1 3454
数据
df<- data.frame(a,b,c,d)
推荐阅读
- c# - 如何添加列表
列出 在 C# foreach 循环中? - c# - 执行存储过程并返回List
在实体框架核心 - c++ - 返回向量时的执行时间差
- sql-server - 如何在 Microsoft SQL Server 中授予架构权限?
- visual-studio-code - 在 Visual Studio Code 的终端模拟器中增加行光标的宽度?
- python - 熊猫数据框覆盖对象
- java - application.properties 中的“spring.profiles.active=test”
- react-native - 使用 React Native 集成的 Azure AD 忽略范围
- c# - 区域内的 Blazor 路由和布局
- ios - 为什么使用 UITableViewHeaderFooterView 或 tableHeaderView 而不是多个 UITableViewCell?