如何基于另一列的唯一值查找列值

时间:2019-01-18 20:09:06

标签: r

我有以下数据集:

Class     Value
A         5.4
A         5.4
A         5.4
B         3.6
B         2.7
C         4.02
C         4.02
C         4.02
D         6.33
D         6.33

我想要的是仅检索具有相似值的类,在这种情况下,该类应返回类AD,但不返回类B,因为它有两个不同的值。

为此,我尝试了以下操作:

sub <- dataset[as.logical(ave(dataset$Value, dataset$Class, FUN = function(x) all(x==x))), ]

但这会返回我不想要的所有类。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

使用aggregate和数字uniquelength(unique)

filterdf=aggregate(Value ~ Class, df, function(x) length(unique(x)))
df[df$Class%in%filterdf[filterdf$Value==1,]$Class,]
   Class Value
1      A  5.40
2      A  5.40
3      A  5.40
6      C  4.02
7      C  4.02
8      C  4.02
9      D  6.33
10     D  6.33

马库斯的替代品

idx <- with(df, ave(Value, Class, FUN = function(x) length(unique(x))) == 1)
df[idx, ]

答案 1 :(得分:0)

使用tidyverse,您可以执行以下操作:

df %>%
 group_by(Class) %>%
 filter(all(Value == first(Value)))

或者:

df %>%
 group_by(Class) %>%
 filter(n_distinct(Value) == 1)

或者:

df %>%
 group_by(Class) %>%
 filter(all(Value %/% first(Value) != 0))

或者:

df %>%
 group_by(Class, Value) %>%
 mutate(temp = seq_along(Value)) %>%
 group_by(Class) %>%
 filter(sum(temp[temp == 1]) == 1) %>%
 select(-temp)

或与@ W-B中的帖子基本相同:

df %>%
 group_by(Class) %>%
 filter(length(unique(Value)) == 1)