Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr在列中的值更改时提取行_R_Dataframe_Dplyr_Row_Extract - Fatal编程技术网

使用dplyr在列中的值更改时提取行

使用dplyr在列中的值更改时提取行,r,dataframe,dplyr,row,extract,R,Dataframe,Dplyr,Row,Extract,每次b中有变化时,我都试图提取行: a b 1 1 A 2 4 A 3 5 A 4 3 B 5 3 B 6 2 B 7 4 B 8 6 A 9 2 A 10 4 C 11 1 C 所以我期望的结果是: a b 1 1 A 2 3 B 3 6 A 4 4 C 我曾想过使用dplyr中的lag函数来提取之前的b值不同但无法实现的行 任何帮助都将非常感激 一个选项可以是: df %>% group_by(rleid = with(rle(b), rep(seq_

每次b中有变化时,我都试图提取行:

   a b
1  1 A
2  4 A
3  5 A
4  3 B
5  3 B
6  2 B
7  4 B
8  6 A
9  2 A
10 4 C
11 1 C
所以我期望的结果是:

  a b
1 1 A
2 3 B
3 6 A
4 4 C
我曾想过使用dplyr中的lag函数来提取之前的b值不同但无法实现的行

任何帮助都将非常感激

一个选项可以是:

df %>%
 group_by(rleid = with(rle(b), rep(seq_along(lengths), lengths))) %>%
 slice(1) 

      a b     rleid
  <int> <chr> <int>
1     1 A         1
2     3 B         2
3     6 A         3
4     4 C         4
df%>%
分组依据(rleid=具有(rle(b),代表(沿(长度)的顺序),长度))%>%
切片(1)
一个b字
1 A 1
2 3 B 2
3 6 A 3
4 C 4

如果您确实想使用
lag
并比较各组的差异,那么您可以执行以下操作:

df %>%
  group_by(grp = cumsum(b != lag(b, default = first(b)))) %>%
  slice(1) 

在这种情况下,在计算第一行时,您可以将默认值设置为
first(b)
,以获得零差异。

一个带有
数据的选项。table

library(data.table)
setDT(df)[rowid(rleid(b)) == 1]
#   a b
#1: 1 A
#2: 3 B
#3: 6 A
#4: 4 C
数据
df
df <- structure(list(a = c(1L, 4L, 5L, 3L, 3L, 2L, 4L, 6L, 2L, 4L, 
1L), b = c("A", "A", "A", "B", "B", "B", "B", "A", "A", "C", 
"C")), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10", "11"))