r - 在数据框中找到点 (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),但我想不出完整的解决方案。
解决方案
这是我的尝试。正如您所说,分组数据是必要的。我用 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
推荐阅读
- android - 不能将 ExoPlayer 视图布局包含到另一个布局中
- python - 如何解决不打印作业要我打印的正确内容的问题?
- java - 如何使用 Spring Boot 和 Maven 测试微服务
- ruby-on-rails - X-Frame-Option 配置在 Rails 中不起作用
- javascript - 点击时谷歌地图更改标记图标
- laravel - 在 Laravel vuejs Axios 中仅填充一个文本框,具体取决于下拉列表中的选定值
- docker - 将运行自定义客户操作系统的虚拟机迁移到容器
- c - OpenMP 对并行计算进行基准测试
- botframework - Microsoft Botframework 上的 ResumeDialogAsync 不会触发
- javascript - 在空数组上调用 .find() 会导致错误