R 值发生变化的子集数据帧

R 值发生变化的子集数据帧,r,dataframe,subset,R,Dataframe,Subset,我想根据值更改的位置过滤data.frame中的行。 假设我有: id name quarter score 1. 01 john q1 2020 80 2. 01 john q2 2020 80 3. 01 john q3 2020 85 4. 01 john q4 2020 75 5. 02 adam q1 2020 80 6. 02 adam q2 2020 8

我想根据值更改的位置过滤
data.frame
中的行。 假设我有:

    id  name  quarter      score      
1.  01  john  q1 2020      80
2.  01  john  q2 2020      80
3.  01  john  q3 2020      85
4.  01  john  q4 2020      75
5.  02  adam  q1 2020      80
6.  02  adam  q2 2020      80
7.  02  adam  q3 2020      85
8.  03  lana  q1 2020      50
无论四分之一和分数在哪里变化,我都要过滤掉这些行。所以上面的数据框应该是

    id  name  quarter      score      
1.  01  john  q2 2020      80
2.  01  john  q3 2020      85
3.  01  john  q4 2020      75
4.  02  adam  q2 2020      80
5.  02  adam  q3 2020      85

如何将单元格的值与R中前一行的值进行比较?

您可以使用
dplyr
中的
lead
功能:

library(dplyr)

result <- df %>% filter(quarter != lead(quarter), score != lead(score))
result
#   id name quarter score
#2.  1 john  q22020    80
#3.  1 john  q32020    85
#4.  1 john  q42020    75
#6.  2 adam  q22020    80
#7.  2 adam  q32020    85

也许你可以试试下面的
subset
+
ave

subset(
  df,
  !!ave(score,id,FUN = function(x) c(TRUE,diff(x)!=0)&length(x)>1)
)

  id name quarter score
1  1 john q1_2020    80
3  1 john q3_2020    85
4  1 john q4_2020    75
5  2 adam q1_2020    80
7  2 adam q3_2020    85
数据

> dput(df)
structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L), name = c("john", 
"john", "john", "john", "adam", "adam", "adam", "lana"), quarter = c("q1_2020", 
"q2_2020", "q3_2020", "q4_2020", "q1_2020", "q2_2020", "q3_2020", 
"q1_2020"), score = c(80L, 80L, 85L, 75L, 80L, 80L, 85L, 50L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))
> dput(df)
structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L), name = c("john", 
"john", "john", "john", "adam", "adam", "adam", "lana"), quarter = c("q1_2020", 
"q2_2020", "q3_2020", "q4_2020", "q1_2020", "q2_2020", "q3_2020", 
"q1_2020"), score = c(80L, 80L, 85L, 75L, 80L, 80L, 85L, 50L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))