【问题标题】:How to remove rows that have repeated elements?如何删除具有重复元素的行?
【发布时间】:2021-09-15 15:09:29
【问题描述】:

我有一个看起来像这样的数据框(但适用于每个美国县)

county state neighbor_county neighbor_state
Baldwin County AL Clarke County NA
Baldwin County AL Escambia County FL
Baldwin County AL Mobile County NA
Baldwin County AL Monroe County NA
Barbour County AL Dale County NA
Barbour County AL Henry County NA

我只对与县相邻的州感兴趣,所以我想删除重复的数据来得到这个(第 1 步):

county state neighbor_state
Baldwin County AL NA
Baldwin County AL FL
Barbour County AL NA

然后像这样更改数据框的排序(第 2 步):

county state neighbor_state_1 neighbor_state_2 neighbor_state_3
Baldwin County AL FL NA NA
Baldwin County AL NA NA NA

在第 1 步中,我删除了“neighbor_county”列;但是,我没有设法删除每个不同县的“neighbor_state”列中的重复项。我尝试过使用 unique 功能,但我似乎无法让它工作,以至于它只删除每个不同县的重复项。

【问题讨论】:

  • 第 2 步的规则是什么?
  • NANA 值还是状态?
  • NA 是 NA 值

标签: r dataframe duplicates


【解决方案1】:

第一步,您可以删除neighbour_county 列并使用unique()

df$neighbor_county <- NULL
unique(df)

返回

          county state neighbor_state
1 Baldwin_County    AL             NA
2 Baldwin_County    AL             FL
5 Barbour_County    AL             NA

使用dplyr的替代方法:

df %>% 
  select(-neighbor_county) %>% 
  distinct()

对于您的第二步,我提出一个建议:

library(tidyr)
library(dplyr)

df %>% 
  group_by(county) %>% 
  select(-neighbor_county) %>% 
  mutate(n = row_number()) %>% 
  pivot_wider(names_from=n, names_prefix="neighbor_state_", values_from=neighbor_state) %>% 
  ungroup()

返回

# A tibble: 2 x 6
  county         state neighbor_state_1 neighbor_state_2 neighbor_state_3 neighbor_state_4
  <chr>          <chr> <chr>            <chr>            <chr>            <chr>           
1 Baldwin_County AL    'NA'             'FL'             'NA'             'NA'            
2 Barbour_County AL    'NA'             'NA'             NA               NA     

但我不确定,如果这就是你要找的。​​p>

要删除双倍的NA-values,您可以使用

df %>% 
  group_by(county) %>% 
  select(-neighbor_county) %>% 
  distinct() %>% 
  mutate(n = row_number()) %>% 
  pivot_wider(names_from=n, names_prefix="neighbor_state_", values_from=neighbor_state) %>% 
  ungroup()

数据

structure(list(county = c("Baldwin_County", "Baldwin_County", 
"Baldwin_County", "Baldwin_County", "Barbour_County", "Barbour_County"
), state = c("AL", "AL", "AL", "AL", "AL", "AL"), neighbor_county = c("Clarke_County", 
"Escambia_County", "Mobile_County", "Monroe_County", "Dale_County", 
"Henry_County"), neighbor_state = c("'NA'", "'FL'", "'NA'", "'NA'", 
"'NA'", "'NA'")), problems = structure(list(row = 6L, col = "neighbor_state", 
    expected = "", actual = "embedded null", file = "literal data"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame")), class = "data.frame", row.names = c(NA, 
-6L), spec = structure(list(cols = list(county = structure(list(), class = c("collector_character", 
"collector")), state = structure(list(), class = c("collector_character", 
"collector")), neighbor_county = structure(list(), class = c("collector_character", 
"collector")), neighbor_state = structure(list(), class = c("collector_character", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1L), class = "col_spec"))

【讨论】:

  • 第 1 步按预期工作。第 2 步在一定程度上也有效——它给了我想要的表格;但是,我最终得到了 48 个“neighbor_state”列,其中每行中的大多数条目都是 NA。理想情况下,我会将其压缩到尽可能少的“neighbor_state”列。我想我理解这个问题,也会寻求解决方案
  • 如果你得到 48 个 neighbor_state 列,则至少有一行包含 48 个条目。除非删除列中的所有双倍条目,否则无法压缩它们。
  • 是的,我现在必须为每一行删除“neighbor_state_1”...“neighbor_state_48”中重复的 NA 值。我会努力做到的!
  • 添加了一行来删除双倍的NA-values。
猜你喜欢
  • 1970-01-01
  • 2011-08-09
  • 2021-07-26
  • 2023-01-02
  • 2020-04-04
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多