找到相关的组

时间:2016-08-04 05:40:27

标签: r

我有这样的数据:

num group
0     433
0     433
0     433
0     211
0     211
0     211
1     309
1     309
1     309
0     424
0     947
1     309
0     433

我想检查一个特定的组在num列中是否总是0或1的值,但我的数据帧有很多行(即组433在开头,而且可能在df的其他行中)。如何对其进行索引?

4 个答案:

答案 0 :(得分:1)

也许table

table(df)
   group
num 211 309 424 433 947
  0   3   0   1   4   1
  1   0   4   0   0   0

<强>更新

以下是一些dplyr替代方案:

library(dplyr)

# To find the number of distinct values per group
df %>% group_by(group) %>% summarise(n_distinct(num))

# To find groups that have only one distinct value and their corresponding value
df %>% group_by(group) %>% 
    summarise(UniqueNum = ifelse(n_distinct(num) > 1, NA, unique(num))) %>% 
    na.omit()

# To find all distinct values per group
df %>% group_by(group) %>% summarise(list(unique(num))) %>% tidyr::unnest()

答案 1 :(得分:1)

您可以在基础R

中查看每个组与tapply有多少不同的值
with(dd, tapply(num, group, function(x) length(unique(x))))

无需重新编制索引。

答案 2 :(得分:1)

嗯,类似于@ Mr.Flick的方法。

您可以使用aggregate查找每个组的unique

aggregate(num ~ group, df, unique)

# group  num
#1   211    0
#2   309    1
#3   424    0
#4   433    0
#5   947    0

如果您只想要每次只有一个值的组,您可以将其扩展到

a <- aggregate(num ~ group, df, function(x) length(unique(x)) == 1)
a[a$num,1]
#[1] 211 309 424 433 947

答案 3 :(得分:0)

这是一个使用data.table来检查lengthunique元素是否在&#39; num&#39;中的选项。在按&#39; group&#39;分组后,列只有1。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)),按&#39;分组&#39;,if length unique个元素组成&#39; num&#39;是1,然后我们得到data.table(.SD

的子集
library(data.table)
setDT(df1)[, if(uniqueN(num) == 1) .SD, by = group]

注意:在OP提供的示例中,所有&#39;组&#39;只有一个唯一元素,因此它将获得完整的数据集。

如果我们需要&#39;组&#39;只有一个unique元素的ID

setDT(df1)[, if(uniqueN(num) == 1)  group, by = group]$V1
#[1] 433 211 309 424 947

如果我们需要&#39; num&#39;专栏以及&#39; group&#39;只要只有一个unique数字&#39;每个小组&#39;

setDT(df1)[,if(uniqueN(num)==1) .(num = num[1L]) , by = group]
#   group num
#1:   433   0
#2:   211   0
#3:   309   1
#4:   424   0
#5:   947   0