Определите, повторяется или нет значение группами в R - PullRequest
2 голосов
/ 14 января 2020

У меня есть данные со многими столбцами и строками. Я хотел бы определить, повторяется ли значение (то же самое) для группы или нет при создании новой логической переменной.

Итак, мои данные выглядят так:

v0 <- c(1,2,3,4,5,6,7,8,9)
v1 <- c("a", "b", "a", "c","e", "c", "b", "b", "e")
v2 <- c("R", NA, "R", "R", "G","C", "R", "R", "G")
dftest <- data.frame(v0, v1, v2)

  v0 v1   v2
1  1  a    R
2  2  b <NA>
3  3  a    R
4  4  c    R
5  5  e    G
6  6  c    C
7  7  b    R
8  8  b    R
9  9  e    G

Мне нужно сравнить значения v1 и v2 таким образом, чтобы одни и те же значения v1 принимали одинаковые значения v2 или нет. Так что мой вывод df будет выглядеть так:

v3 <- c(T, F, T, F, T, F, F, F, T )
dfresult <- data.frame(v0, v1, v2, v3)

  v0 v1   v2    v3
1  1  a    R  TRUE
2  2  b <NA> FALSE
3  3  a    R  TRUE
4  4  c    R FALSE
5  5  e    G  TRUE
6  6  c    C FALSE
7  7  b    R FALSE
8  8  b    R FALSE
9  9  e    G  TRUE

Любое предложение будет оценено. Спасибо.

Ответы [ 3 ]

2 голосов
/ 14 января 2020

Один из способов будет следующим. Насколько я вижу ваш вопрос, кажется, что вы хотите вернуть TRUE, когда в группе v2 есть только одно уникальное значение. В противном случае вы хотите вернуть FALSE.

library(dplyr)

group_by(dftest, v1) %>% 
mutate(v3 = n_distinct(v2) == 1)

#     v0 v1    v2    v3   
#  <dbl> <fct> <fct> <lgl>
#1     1 a     R     TRUE 
#2     2 b     NA    FALSE
#3     3 a     R     TRUE 
#4     4 c     R     FALSE
#5     5 e     G     TRUE 
#6     6 c     C     FALSE
#7     7 b     R     FALSE
#8     8 b     R     FALSE
#9     9 e     G     TRUE

Если вы используете пакет data.table, вы можете сделать следующее.

setDT(dftest)[, v3 := uniqueN(v2) == 1, by = v1][]
1 голос
/ 14 января 2020

Вот базовое решение R, где используется ave

dfresult <- within(dftest, v3 <- as.logical(ave(as.vector(v2),v1,FUN = function(x) length(unique(x))==1)))

, такое что

> dfresult
  v0 v1   v2    v3
1  1  a    R  TRUE
2  2  b <NA> FALSE
3  3  a    R  TRUE
4  4  c    R FALSE
5  5  e    G  TRUE
6  6  c    C FALSE
7  7  b    R FALSE
8  8  b    R FALSE
9  9  e    G  TRUE
0 голосов
/ 15 января 2020

Опция с использованием пакета data.table:

library(data.table)
setDT(dftest)[, v3 := uniqueN(v2)==1L, v1]

Вывод:

   v0 v1   v2    v3
1:  1  a    R  TRUE
2:  2  b <NA> FALSE
3:  3  a    R  TRUE
4:  4  c    R FALSE
5:  5  e    G  TRUE
6:  6  c    C FALSE
7:  7  b    R FALSE
8:  8  b    R FALSE
9:  9  e    G  TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...