【问题标题】:Unique different rows per group每组唯一不同的行
【发布时间】:2018-06-10 00:17:45
【问题描述】:

我有一个看起来像这样的数据框

    DF <- data.frame(x=rep(c("A", "B", "C"), times=1, each=3),
            y=c(1,2,3))

这给了我

       x y
     1 A 1
     2 A 2
     3 A 3
     4 B 1
     5 B 2
     6 B 3
     7 C 1
     8 C 2
     9 C 3

在我的原始数据框中,每一列代表一个人。所以我必须用一个 x 匹配一个 y,给我类似的东西

    x y
    A 1
    B 2
    C 3

换句话说,我需要 y 按 x 分组,但 y 不能沿数据框重复。

有什么好办法吗?

我真的在 stackoverflow 上寻找它,但找不到任何可以帮助我的东西。谢谢!!

【问题讨论】:

  • 您能否提供更多关于我们如何为x 选择y 的详细信息?例如,您是否还允许 (A,2)、(B, 1) 和 (C,3)?
  • 对不起,我没有提供足够的信息。我只需要对于 X 中的每个值,都有一个 Y 将再次出现在任何其他 X 中。顺序无关紧要,如果它是 (A,2)、(B,1) 和 (C,3),或者(A,1), (B,2), (C,3)。重要的是,如果 2 与 A 一起,则一定不能与 B 或 C 一起,依此类推。另一个重要的事情是它们不是规则的,它们可能是,例如 x y A 1 A 2 B 1 B 2 B 3 B 4 C 1 C 2 C 3
  • *对于 X 中的每个值,都有一个 Y 不会再次出现在任何其他 X 中

标签: r group-by unique


【解决方案1】:

使用dplyr 的解决方案,假设所有组的行数与组号相同。

library(dplyr)

DF2 <- DF %>%
  mutate(Group_ID = group_indices(., x)) %>%
  group_by(x) %>%
  summarise(y = y[first(Group_ID)]) %>%
  ungroup()
DF2
# # A tibble: 3 x 2
#   x         y
#   <fct> <dbl>
# 1 A         1
# 2 B         2
# 3 C         3

或者我们可以使用以下:

DF2 <- DF %>% filter(as.numeric(x) == y)
DF2
#   x y
# 1 A 1
# 2 B 2
# 3 C 3

这是有效的,因为列 x 是因素。当我们将其转换为数字时,我们可以直接使用y中的值进行过滤。

【讨论】:

  • 如果列不是因子,则使用DF %&gt;% filter(match(x, unique(x)) == y)setDT(DF)[, .SD[.GRP ==y], x]
  • @akrun 好建议。我从没想过filter(match(x, unique(x)) == y)。谢谢!
  • 抱歉,它们的行数与组号不同。它可以是任何东西,例如 (A 1) (A 2) (B 1) (B 2) (B 3) (B 4) (C 1) (C 2) (C 3) (D 1) (D 2) ) (天 3) (天 4) (天 5)
猜你喜欢
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多