2015-03-31 78 views
3

这是一个基本问题,但我一直坚持它很长一段时间。我试图将ColumnB中的值分组,但只能在ColumnA中的每个值中分组。如何将一列中的值分组为另一个R中的每个唯一值?

初始数据帧将是这样的:

ColumnA = c(1,1,1,2,2,2) 
ColumnB = c("f","g","g","f","f","h") 
df <- data.frame(ColumnA,ColumnB) 
ColumnA ColumnB 
    1   f 
    1   g 
    1   g 
    2   f 
    2   f 
    2   h 

其结果将是:

ColumnA ColumnB 
    1   f 
    1   g 
    2   f 
    2   h 

(其中一种方法我尝试使用与dplyr使用:group_by(df, ColumnB),但是这种尝试不成功)。

回答

3

您也可以尝试duplicated

df[!duplicated(df),] 
# ColumnA ColumnB 
#1  1  f 
#2  1  g 
#4  2  f 
#6  2  h 

如果需要,这也会给出行的逻辑索引。

+0

@jlw没问题。很高兴帮助你 – akrun 2015-03-31 13:17:56

8

The unique功能特别适合(没有双关语意)来解决问题:

df <- data.frame(v1=c(1,1,1,2,2,2), v2=c("f", "g", "g", "f", "f", "h")) 
df <- unique(df) 

> df1 
    v1 v2 
1 1 f 
2 1 g 
4 2 f 
6 2 h 
2

随着dplyr,你会想要将它们分组后进行的操作;单独的分组不会折叠行。你可以计算出一些与summarise(),基于变量等集团内挑一排下面是与slice()一个例子来选择各个组组合中的第一条记录:

library(dplyr) 
df %>% 
    group_by(ColumnA, ColumnB) %>% 
    slice(1) # select the first row within each group combination 

Source: local data frame [4 x 2] 
Groups: ColumnA, ColumnB 

    ColumnA ColumnB 
1  1  f 
2  1  g 
3  2  f 
4  2  h 
+0

谢谢山姆的回应 - 如果不止一行必须分组,那么是否有一种有效的方法来将每一个分组? – joat1 2015-03-31 13:12:09

+0

您的问题是关于分组变量(列)或子组内的行吗?如果要在子组中选择不同的行或多行,可以编辑上面的最后一行;如果您想按许多列进行分组,并且不想输入它们,则可以将它们作为变量传递:http://stackoverflow.com/questions/21208801/group-by-multiple-columns-in-dplyr-使用字符串向量输入 – 2015-03-31 13:18:45

相关问题