2015-04-23 66 views
0

感謝迄今的迴應。在數據幀中打破關係(dplyr,data.table,base r)

我已經在我的問題上花了幾個小時,並認爲最好重新構建我的問題。我不再認爲dplyr會起作用。這是我的問題。

約束:需要以編程方式訪問列名(使用dplyr會產生問題)。

首選,但不是必需的:解決方案沒有數據框的副本。

代碼設置:

set.seed(11) 
N <- 12 
A <- sample(LETTERS, N, replace=FALSE) 
B <- c(rep(c("AA"), 4), rep(c("BA"), 4),rep(c("CA"), 4)) 
C <- sample(4:10, N, replace=TRUE) 

df <- as.data.frame(cbind(A,B,C)) 
dt <- as.data.table(df) 

rank_tb <- dt[order(B,C,A)] 

輸出:

A B C 
1: E AA 4 
2: M AA 5 
3: B AA 6 
4: O AA 7 
5: I BA 5 
6: D BA 6 
7: P BA 7 
8: U BA 9 
9: Q CA 5 
10: V CA 5 
11: J CA 8 
12: X CA 9 

rank_tb讓我走了一半,註上 「B」 列分組被保留,然後數據幀進行排序的列 「C」最後關係被列A打破 - >見第9行和第10行。我最後想要的是以下內容:

A B C rank 
1: E AA 4 1 
2: M AA 5 2 
3: B AA 6 3 
4: O AA 7 4 
5: I BA 5 1 
6: D BA 6 2 
7: P BA 7 3 
8: U BA 9 4 
9: Q CA 5 1 
10: V CA 5 2 
11: J CA 8 3 
12: X CA 9 4 

,它是按「B」列分組的「C」分類列。

下面是我原來的問題的文本,再次感謝您的時間..

是否有使用第二柱脫離任何的像dplyr包ROW_NUMBER排序函數關係的方法?目前我有:

dat <- data %>% 
filter(!is.na(col1)) %>% 
group_by(col2) %>% 
filter(row_number(col1) == 1) 

目前我不確定如何ROW_NUMBER打破了COL1的關係,並希望指定單獨的山坳用來打破的關係:

dat <- data %>% 
filter(!is.na(col1)) %>% 
group_by(col2) %>% 
filter(row_number(col1, col3) == 1) 

感謝adavance

+0

你看過'?row_number'幫助頁嗎?這個函數只需要一個參數,所以如果你想改變行的順序,你可能會首先「排列()」(排序)你的組。 – MrFlick

+0

你只想要每組的第一行? –

+0

請考慮提供一個可重現的示例,其中包含幾行數據集。 – akrun

回答

0

我其實不太清楚,如果我理解你的問題。如果你想要每個組的第一行,你可以使用

data %>% 
group_by(col2) %>% 
filter(row_number()==1) 
+1

在這種情況下,我寧願使用'slice(1)'。 –

+0

感謝您提出「切片」。但是請注意,'slice'可能不適用於數據庫。 –