我有一個有很多觀察值的資料框架。我正試圖對資料進行過濾/子集,只顯示具有一個以上索引值的唯一ID,而且這些值是按系列排列的(1-2,2-3,1-3,4-5,等等)。任何只有一行或在索引列內只有一個特定值的ID應該被洗掉。
下面是資料的例子:
df:
ID索引
9930 1
99302
9930 3
9930 NA
9929 3
9929 3
9915 1
9916 3
9916 4
9999 7
9999 8
9999 10
上述資料的預期輸出示例:
df_new:
ID索引
9916 3
9916 4
9930 1
9930 2
9930 3
99997
9999 8
如果有任何幫助,我們將不勝感激!
uj5u.com熱心網友回復:
我們可以使用diff在通過'ID'分組后創建一個分組列,然后過濾有超過1行的組
library(dplyr)
df %>%。
na.省略%>%。
group_by(ID)%>%
mutate(new = cumsum(c(TRUE。 diff( index) ! = 1)) %>%
group_by(new, . add = TRUE) %>%
filter(n() > 1) %>%
ungroup %>%
select(-new) %>%
arrange(ID)
輸出
# A tibble: 7 x 2
ID索引
<int> <int>
1 9916 3
2 9916 4
3 9930 1
4 9930 2
5 9930 3
6 9999 7
7 9999 8
data
df < -結構(list(ID = c( 9930L, 9930L, 9930L,, 9929L, 9929L, 9929L,
9915L, 9916L,, 9999L, 9999L。 9999L)。 index = c(1L。 2L,
3L, NA, 3L。 3L, 1L, 3L。 4L, 7L, 8L。 10L)),
class = "data.frame", 行。 names = c(NA,)
-12L))
uj5u.com熱心網友回復:
一種類似于@akrun的方法,使用lag而不是diff:
df %>%.
arrange(ID, index) %>%
group_by(ID) %>%
filter(n() > 1, ! is.na(index) %>%
mutate(tmp = index -lag(index)) %> %
filter(max(tmp, na. rm = TRUE) > 0。 tmp %in% c(1。 NA))
select(-TMP)
# A tibble: 7 x 2
ID索引
<dbl> <dbl>
1 9916 3
2 9916 4
3 9930 1
4 9930 2
5 9930 3
6 9999 7
7 9999 8
uj5u.com熱心網友回復:
而這是另一個可能的解決方案,使用巧妙的f函式
library(tidyverse)
df = tribble()
~ID, ~index,
9930, 1, 1
9930, 2,9930, 3,9930, NA, NA,
9929, 3,
9929, 3,
9915, 1,
9916, 3,
9916, 4,9999, 7,9999, 8,9999, 10)
f = function(x) if if(length(x)> 1) x-lag(x, 默認= 2*x[1]*x-x[/span>2]) else 0
df %>% filter(! is。 na(index) %>%
arrange(ID, index) %>%
group_by(ID) %>%
mutate(nID = n(),
sInddex = f(index) %>%
filter(nID> 1, sInddex==1) %> %
select(-nID, -sInddex)
輸出
# A tibble: 7 x 2
# Groups: ID[3]
ID索引
<dbl> <dbl>
1 9916 3
2 9916 4
3 9930 1
4 9930 2
5 9930 3
6 9999 7
7 9999 8
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/310847.html
標籤:
上一篇:洗掉文本檔案中每一列的重復內容
