首页 > 解决方案 > 在数据框中找到点 (col_1[ i ], col_2[ i ]) = (col_1[ j ], -col_2[ j ])

问题描述

我可能错过了一个明显的解决方案,但这里有:

考虑下面的数据框。我希望创建一个具有 TRUE/FALSE 值的列,只要满足条件 (col_1[i], col_2[i]) = (col_1[j], -col_2[j]),该值就为 TRUE。请注意 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)

在此处输入图像描述

我想要的是:

在此处输入图像描述

我认为答案一定是 df %>% group_by(x),但我想不出完整的解决方案。

标签: rdataframeduplicates

解决方案


这是我的尝试。正如您所说,分组数据是必要的。我用 col_1 和 foo 定义了组。foo 包含 col_2 的绝对值。如果观察数大于 1 并且 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

正如 Ronak 之前提到的,可能会有这样的情况。

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

推荐阅读