Ваш ожидаемый результат означает, что вы заинтересованы только в корректировке случаев, когда результат f()
не зависит от y
.Для этого можно использовать dplyr
методы:
library(dplyr)
find_independent <- function(data) {
data %>%
inner_join(data %>%
group_by(x, f) %>%
count(),
by=c("x", "f")) %>%
mutate(y = if_else(n == 2, "_", y)) %>%
distinct()
}
find_independent(df1)
x y f
1 a A 3
2 b E 4
3 a E 5
4 b A 2
find_independent(df2)
x y f
1 a _ 4
2 b E 4
3 b A 2
Объяснение (на примере df2
):
Сначала group_by
x
и f
и подсчитайте количество вхождений.
df2 %>% group_by(x, f) %>% count()
# A tibble: 3 x 3
# Groups: x, f [3]
x f n
<chr> <int> <int>
1 a 4 2
2 b 2 1
3 b 4 1
Объедините этот счетчик с исходным фреймом данных, и для строк, где n == 2
, измените значение y
на _
.
- Удаление дублирующихся строк (которые будут строками, в которых
y
не влияет на f
), используя distinct()
.
Данные:
df1 <- structure(list(x = c("a", "b", "a", "b"), y = c("A", "E", "E",
"A"), f = c(3L, 4L, 5L, 2L)), class = "data.frame", row.names = c(NA,
-4L))
df2 <- structure(list(x = c("a", "b", "a", "b"), y = c("A", "E", "E",
"A"), f = c(4L, 4L, 4L, 2L)), class = "data.frame", row.names = c(NA,
-4L))