2016-01-28 31 views
1

如何僅選擇在特定列中後跟相同值的行?僅從數據框中選擇特定情況

即 從這個(使用作爲基準V1的值)

`v1 = c(1,1,2,3,1,2,4,1,1,2,3,4) 
v2 = seq(1:12) 
v3 = c(rep("blue", 4), rep("red", 4), rep("green", 4)) 
df<- data.frame(v1, v2, v3) 
df` 

> df 
    v1 v2 v3 
1 1 1 blue 
2 1 2 blue 
3 2 3 blue 
4 3 4 blue 
5 1 5 red 
6 2 6 red 
7 4 7 red 
8 1 8 red 
9 1 9 green 
10 2 10 green 
11 3 11 green 
12 4 12 green 

此;其中只有情況1和8,這是其次的情況下爲V1值也爲1個保存

v1 v2 v3 
1 1 1 blue 
8 1 8 red 

回答

0

您可以提取感興趣的索引,然後從數據框中提取感興趣的行。

indices <- which(df$v1[1:(nrow(df)-1)]==df$v1[2:nrow(df)]) 
df.new <- df[indices,] 
+0

@Christopher Brown選項比akrun更快。我的數據框有超過1.600.000個案例,akrun選項需要15'和20'之間。第二個只有幾秒鐘。 –

2

我們可以使用rleiddata.table讓遊程類型ID,用它作爲分組變量,和if的nrow大於1(.N >1),選擇第一個觀察值(head(.SD, 1L))。

library(data.table) 
setDT(df)[, if(.N>1) head(.SD, 1L) ,.(v1,rleid(v1))][,rleid:= NULL][] 
# v1 v2 v3 
# 1: 1 1 blue 
# 2: 1 8 red 

注意:我們用setDT(df)將'data.frame'轉換爲'data.table'。

+1

這不是問題的可伸縮解決方案 – mtoto

+0

@mtoto你能解釋一下你的意思嗎? – akrun

+0

我編輯了他的問題,一開始我都不清楚。他想要返回在'v1' – mtoto

相關問題