2017-04-02 99 views
0

我有一張表,其中包含有關某些用戶的信息。我想要做的是提取每個用戶的第三行和最後一行...我該怎麼做?因此,例如:R如何獲得每個用戶的第三行和最後一行

User | num | 

use1 | 3 | 

use1 | 2 | 

use1 | 5 | 

use1 | 8 | 

use1 | 6 | 

use2 | 1 | 

.. 

因此,在這個例子中,我會希望將該行與num = 5num = 6,這將繼續爲表中的每個不同的用戶。

回答

1

對於多種,這裏是一個plyr解決方案:

library(plyr) 

#group by user and return 3rd and last row 
ddply(df, .(User), function(x) x[c(3, nrow(x)),]) 
+0

非常感謝這樣做 – jim

+0

這在語義上與下面的dplyr解決方案相同。 – jkeirstead

+0

人們仍然使用plyr? –

1

這個怎麼樣?

library(dplyr) 

# Assuming df is your sample data 
df %>% group_by(User) %>% filter(row_number() %in% c(3, n())) 
+0

這沒有工作 – jim

+0

以什麼方式?在這裏用dplyr 0.4.3 – jkeirstead

+0

@jkeirstead - 可以確認它確實有效。話雖如此 - 'df%>%group_by(user)%>%slice(c(3,n()))'可能更簡潔 – thelatemail

1

你可以使用這樣的data.table解決方案:

library(data.table) 

dt = data.table("user" = c(rep(1,5),rep(2,5)),"num" = c(3,2,5,8,6,10:6)) 

dt[, "row" := 1:.N, by =.(user)] 

> dt[ , .(Num = 3,.N), by = .(user)] 
    user Num N 
1: 1 3 5 
2: 2 3 5 
+0

是dt假設是存儲我的表的變量,如果我已經有該變量,我必須包括第二行? – jim

+0

@jim所以如果data.table包中有一個data.frame加載並運行'setDT(yourdataframename),然後像上面那樣運行它 – Kristofersen

+0

@jim它看起來像你的數據框被命名爲df。所以你可以運行'setDT(df),然後用dt換出dt,它將全部工作。如果你的data.frame真的很大,data.table將是最快的解決方案。 – Kristofersen

0

我們可以使用base R

i1 <- with(data, as.logical(ave(seq_along(User), User, FUN = 
      function(x) seq_along(x) %in% c(3, length(x) & length(x) > 3)))) 
data[i1,] 
相關問題