【问题标题】:Find point in dataframe where (col_1[ i ], col_2[ i ]) = (col_1[ j ], -col_2[ j ])在数据框中找到点 (col_1[ i ], col_2[ i ]) = (col_1[ j ], -col_2[ j ])
【发布时间】:2020-01-22 08:45:08
【问题描述】:

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

考虑下面的数据框。我希望创建一个具有 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),但我想不出完整的解决方案。

【问题讨论】:

  • 我不清楚你在问什么,这里面的 x 和 a 是什么??
  • 您需要先指定x,y,z的值我们才能回答
  • 对不起!做了一些编辑,希望现在更清楚

标签: r dataframe duplicates


【解决方案1】:

这是我的尝试。正如您所说,分组数据是必要的。我用 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

【讨论】:

  • 非常感谢您花时间回答。这正是我所需要的,你为我解决了一个大难题。再次感谢! :D
  • @SofieAbildgaard 我很高兴听到这对您有所帮助。祝你工作顺利。
  • 是的,有道理。完美。
  • @RonakShah 你提出了一个很好的观点。我最初对此视而不见。非常感谢你。 :)
【解决方案2】:

您可以尝试以下基本 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

【讨论】:

    猜你喜欢
    • 2012-04-18
    • 2012-10-20
    • 1970-01-01
    • 2023-04-05
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多