Как найти значение столбца на основе уникального значения для другого столбца - PullRequest
0 голосов
/ 18 января 2019

У меня есть следующий набор данных:

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

Я хочу получить только те классы, которые имеют сходные значения, которые в этом случае должны возвращать класс A и D, но не, например, класс B, поскольку он имеет два разных значения.

Для этого я попробовал следующее:

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

Но это возвращает все классы, которые я не хочу.

Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

С 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)
0 голосов
/ 18 января 2019

Использование aggregate с номером unique (length(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, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...