Найти точку в кадре данных, где (col_1 [i], col_2 [i]) = (col_1 [j], -col_2 [j]) - PullRequest
1 голос
/ 22 января 2020

Может быть очевидное решение этого, которое я пропустил, но здесь идет:

Рассмотрим кадр данных ниже. Я sh создаю столбец со значениями ИСТИНА / ЛОЖЬ, где значение ИСТИНА, когда выполняется условие (col_1 [i], col_2 [i]) = (col_1 [j], -col_2 [j]). Обратите внимание, что sum () здесь не работает, поскольку может быть третье значение. Разработать; то, что у меня есть:

col_1 <- c("x", "x", "y", "y", "y", "z", "z")
col_2 <- c(-1, 1, 3, -3, 4, 7, 3)
df <- data.frame(col_1, col_2)

enter image description here

Что я хочу:

enter image description here

Я думаю, что ответом должно быть что-то с df%>% group_by (x), но я не могу придумать полного решения.

Ответы [ 2 ]

1 голос
/ 22 января 2020

Вот моя попытка. Как вы сказали, группировка данных необходима. Я определил группы с col_1 и foo. foo содержит абсолютные значения col_2. Если количество наблюдений больше единицы, а уникальное число наблюдений в col_2 равно 2. У вас есть пары, которые вы ищете.

group_by(df, col_1, foo = abs(col_2)) %>% 
mutate(check = n() > 1 & n_distinct(col_2) == 2) %>% 
ungroup %>% 
select(-foo)

  col_1 col_2 check
  <fct> <dbl> <lgl>
1 x        -1 TRUE 
2 x         1 TRUE 
3 y         3 TRUE 
4 y        -3 TRUE 
5 y         4 FALSE
6 z         7 FALSE
7 z         3 FALSE

Как уже упоминал Ронак, могут быть такие случаи.

col_1 <- c("x", "x", "y", "y", "y", "z", "z")
col_2 <- c(1, 1, 3, -3, 4, 7, 3) 
df2 <- data.frame(col_1, col_2)

  col_1 col_2
1     x     1
2     x     1
3     y     3
4     y    -3
5     y     4
6     z     7
7     z     3

group_by(df2, col_1, foo = abs(col_2)) %>% 
mutate(check = n() > 1 & n_distinct(col_2) == 2) %>% 
ungroup %>% 
select(-foo)

  col_1 col_2 check
  <fct> <dbl> <lgl>
1 x         1 FALSE
2 x         1 FALSE
3 y         3 TRUE 
4 y        -3 TRUE 
5 y         4 FALSE
6 z         7 FALSE
7 z         3 FALSE
0 голосов
/ 22 января 2020

Вы можете попробовать следующий базовый код R, где определена пользовательская функция f для проверки суммы:

f <- function(v) {
  unique(c(combn(seq(v),2)[,combn(v,2,sum)==0]))
}

dfout <- Reduce(rbind,
                lapply(split(df,df$col_1), 
                       function(v) {
                         v$col_3 <- F
                         v$col_3[f(v$col_2)] <- T
                         v
                       })
)

dfout <- dfout[order(as.numeric(rownames(dfout))),]

такая, что

> dfout
  col_1 col_2 col_3
1     x    -1  TRUE
2     x     1  TRUE
3     y     3  TRUE
4     y    -3  TRUE
5     y     4 FALSE
6     z     7 FALSE
7     z     3 FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...