按列阈值细分数据框

时间:2020-01-11 17:02:54

标签: r dataframe subset

我有一个数据框,其中包含有关市政当局地方选举的信息,我想在我的数据集中仅保留与市政当局投票最多的两名候选人有关的信息。

我的数据框是使用以下信息创建的:

Theorem add_n_injective : forall n m p, n + m = n + p -> m = p.
Proof.
  intros. induction n.
  - exact H.
  - apply IHn.  (* goal: n + m = n + p *)
    simpl in H. (* H: S (n + m) = S (n + p) *)
    congruence.
Qed.

看起来像这样:

Candidates <- c('Liza S.', 'John R.', 'Peter F.', 'Ignacio R.', 'Hanna F.', 'Anthony E.', 'Andrew W.')`
Municipality <- ('A', 'A', 'A', 'B', 'B', 'B', 'B')
Votes <- c(100, 120, 140, 110, 335, 225, 400)
data <- data.frame(Candidates, Municipality, Votes)

我希望我的数据框看起来像这样:

Candidates     Municipality     Votes
Liza S.              A           100
John R.              A           120
Peter F.             A           140
Ignacio R.           B           110
Hanna F.             B           335
Anthony E.           B           225
Andrew W.            B           400

关于如何实现此目标的任何想法?

4 个答案:

答案 0 :(得分:3)

您可以为此使用dplyr软件包:

library(dplyr)

    data %>% 
       group_by(Municipality) %>% 
       top_n(n = 2, wt = Votes)


# A tibble: 4 x 3
# Groups:   Municipality [2]
  Candidates Municipality Votes
  <fct>      <fct>        <dbl>
1 John R.    A              120
2 Peter F.   A              140
3 Hanna F.   B              335
4 Andrew W.  B              400

答案 1 :(得分:2)

您可以根据特定于自治市(ave()的{​​{1}})来rev子集。

order()

数据:

dat[ave(dat$Votes, dat$Municipality, FUN=function(x) rev(order(x))) <= 2, ]
#   Candidates Municipality Votes
# 2    John R.            A   120
# 3   Peter F.            A   140
# 5   Hanna F.            B   335
# 7  Andrew W.            B   400

答案 2 :(得分:1)

在基数R中:

do.call("rbind",
        lapply(split.data.frame(data, Municipality), 
               function(x) x[rev(order(x$Votes))[1:2],]))    
#    Candidates  Municipality Votes
# A.3   Peter F.            A   140
# A.2    John R.            A   120
# B.7  Andrew W.            B   400
# B.5   Hanna F.            B   335

答案 3 :(得分:1)

这是使用dplyr软件包的一种方式;

library(dplyr)

# Creating data
Candidates <- c('Liza S.', 'John R.', 'Peter F.', 'Ignacio R.', 'Hanna F.', 'Anthony E.', 'Andrew W.')
Municipality <- c('A', 'A', 'A', 'B', 'B', 'B', 'B')
Votes <- c(100, 120, 140, 110, 335, 225, 400)
data <- data.frame(Candidates, Municipality, Votes)

data %>%
  # Grouping by Municipality
  group_by(Municipality) %>%
  # Sorting the data desc by Votes
  arrange(desc(Votes)) %>%
  # Getting first and second highest values for each group
  slice(1:2) %>%
  ungroup() %>%

#   # A tibble: 4 x 3
#   # Groups:   Municipality [2]
#   Candidates Municipality Votes
# <fct>      <fct>        <dbl>
# Peter F.   A              140
# John R.    A              120
# Andrew W.  B              400
# Hanna F.   B              335