破坏数据框中的联系(dplyr,data.table,base r)

时间:2015-04-23 04:06:55

标签: r sorting data.table dplyr

感谢到目前为止的回复。

我已经花了几个小时来处理我的问题,并认为最好重新构思我的问题。我不再认为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让我走了一半,注意分组#34; B&#34;保留后,数据帧然后在列&#34; C&#34;通过小组和最后的关系被列#34; A&#34; - &GT;见第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

这是&#34; C&#34;按列分组&#34; B&#34;被&#34; A&#34;。

打破的关系

以下是我原来问题的文字,再次感谢您的时间..

是否有一种方法可以使用第二列来破坏dplyr包中row_number等任何排序函数的联系?目前我有:

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

目前我不确定row_number如何打破col1中的关系,并且想要指定一个单独的col来用来打破关系:

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

谢谢你

1 个答案:

答案 0 :(得分:0)

我实际上不太确定我是否理解你的问题。如果您想要每组的第一行,可以使用

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