假设我有两个数据表
df1
x y f(x,y)
1 a A 3
2 b E 4
3 a E 5
4 b A 2
和
df2
x y f(x,y)
1 a A 4
2 b E 4
3 a E 4
4 b A 2
如果我们将x和y列解释为对某些结果的影响,则可以说在第二个示例(df2
)中,对于x = a,结果与y列无关。我想要生成报告的方式是删除所有不影响结果的列,因此我想创建df2_out
而不是df2
(以避免出现一些大表) )
df2_out
x y f(x,y)
1 a - 4
2 b E 4
3 b A 2
df1
应该保持不变,因为x,y对结果有影响:
df1_out
x y f(x,y)
1 a A 3
2 b E 4
3 a E 5
4 b A 2
我如何在R中实现这一目标?有没有更好的方法来打印数据表?
答案 0 :(得分:2)
您的预期输出表明您仅对调整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))