【问题标题】:Locating duplicated entries in a column of a dataframe?在数据框的列中找到重复的条目?
【发布时间】:2021-08-23 15:59:49
【问题描述】:

在 11:13 和 14:16 的行中,可以观察到在 'm:' 和 'n:' 的列 'C2_xsampa' 中有重复的条目。 'C2_xsampa' 中的每个值都有两个级别,Singleton 或 Geminate,但在 'm:' 和 'n:' 中并非如此。这会为数值列产生错误的平均值。

我的问题是:如何过滤重复的行?我已经手动检查了获取值的父数据集。那里一切看起来都很好。

之前,我使用子集 () 来纠正输入中的“真实”错误。

数据:

C2_xsampa Consonant Speaker C1.dn C2.dn V1.dn V2.dn total.dn
 1 "d_d"     Singleton    8.5  11.9   7.82 13.0   7.65     40.3
 2 "d_d:"    Geminate     9    11.6  11.9  11.4   7.46     42.3
 3 "dZ"      Singleton    8.31  7.79  7.47 14.9   9.81     40.0
 4 "dZ:"     Geminate     8.08  7.72 13.4  12.8   9.61     43.6
 5 "g"       Singleton    9    12.1  11.3  11.9   8.56     43.9
 6 "g:"      Geminate     8.69 11.3  11.1  12.7  10.2      45.3
 7 "k"       Singleton    9.5  12.3  14.4   9.71  6.97     43.4
 8 "k:"      Geminate     9    14.7  16.1  10.1   7.37     48.2
 9 "l"       Singleton    8.69 11.9   6.33 11.5  10.2      40.0
10 "l:"      Geminate     8.81 11.3  10.0  10.0  11.5      42.8
11 "m"       Singleton    8.36 13.6   9.11 11.1   9.20     43.0
12 "m:"      Geminate     8.85 13.7  10.9   9.95  8.42     43.0
13 "m: "     Geminate    14    14.6  12.4   5.66  5.01     37.7
14 "n"       Singleton    8    15.1   4.44 11.6   8.99     40.2
15 "n:"      Geminate     8.21 21.4  10.1  10.2   9.32     51.0
16 "n: "     Geminate    11.3  32.0  10.4   8.09  7.94     58.5
17 "p"       Singleton    8.4  11.2  11.9   7.98  6.53     37.7
18 "p:"      Geminate     8.81 13.2  12.7   8.57 11.3      45.8
19 "t`"      Singleton    9    12.9  10.5   8.69  9.20     41.3
20 "t`:"     Geminate     9    13.1  13.1   8.39 10.6      45.2

谢谢。

【问题讨论】:

  • 虽然我能够发现问题,但不清楚您希望如何区分“正确”或“错误”副本。仅查看您的示例,第二个 Geminate 的值似乎明显高于第一个条目。从“正确”的情况来看,这些值相对接近。因此,您可以计算每个C2_sampa 组的total.dn 的差异。然后删除 (filter) 差异较大的行。 !!!确保我的理解是正确的!!!。
  • 您还谈到了源数据集和使用子集()来修复问题。通常,当您合并事物时,会向附加行注入连接。或者您的代码确实创建了行,您需要捕获另一个异常。
  • 太好了,我们成功地结束了这一切。 @Zaw 的代码看起来非常高效。请注意,我们无法真正告诉您为什么会出现这两个条目。这将需要查看您为构建数据集所做的工作。根据自己的经验,我知道我经常使用合并/连接或在向数据集中添加条件行时创建倍数。这些重复通常是因为我忘记了条件。如果您提供一个示例 11:13 和 14:16 行是如何产生的,我们可能能够发现哪里出了问题。无论如何,你得到了你需要的东西(ed)。祝您旅途愉快!
  • @Ray,条目在值 'm:' 和 'n:' 之后有一些额外的空格。这就是为什么输出在“C2_xsampa”列中显示相同值的两个不同因素。这是制作父数据集时的手动错误。很高兴,我在这里发布了,父数据集中还有其他一些错误类型已得到纠正。

标签: r subset mean


【解决方案1】:

您可以检查两列的值在整个数据集中是唯一的

df = df.drop_duplicates(subset=['C2_xsampa','Consonant'])

你可以得到逆 df[~df] 来得到不正确的行

edit 刚刚看到 r 语言标签 我相信distinct(select(df, C2_xsampa, Consonant))会做

【讨论】:

    【解决方案2】:

    C2_xsampa 的某些值中似乎存在不必要的符号和空格。这是使用{tidyverse} 的建议。首先,它删除符号/空格,然后通过C2_xsampaConsonant 识别重复的行。您可以使用dup 列过滤重复的行。

    library(tidyverse)
       
    dat1 <- dat %>% 
      mutate(C2_xsampa = str_trim(C2_xsampa)) %>% 
      group_by(C2_xsampa, Consonant) %>% 
      mutate(dup = n()) %>%
      ungroup()
    
    dat1
    
    # # A tibble: 20 x 9
    #    C2_xsampa Consonant Speaker C1.dn C2.dn V1.dn V2.dn total.dn   dup
    #    <chr>     <chr>       <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl> <int>
    #  1 d_d       Singleton    8.5  11.9   7.82 13     7.65     40.3     1
    #  2 d_d:      Geminate     9    11.6  11.9  11.4   7.46     42.3     1
    #  3 dZ        Singleton    8.31  7.79  7.47 14.9   9.81     40       1
    #  4 dZ:       Geminate     8.08  7.72 13.4  12.8   9.61     43.6     1
    #  5 g         Singleton    9    12.1  11.3  11.9   8.56     43.9     1
    #  6 g:        Geminate     8.69 11.3  11.1  12.7  10.2      45.3     1
    #  7 k         Singleton    9.5  12.3  14.4   9.71  6.97     43.4     1
    #  8 k:        Geminate     9    14.7  16.1  10.1   7.37     48.2     1
    #  9 l         Singleton    8.69 11.9   6.33 11.5  10.2      40       1
    # 10 l:        Geminate     8.81 11.3  10    10    11.5      42.8     1
    # 11 m         Singleton    8.36 13.6   9.11 11.1   9.2      43       1
    # 12 m:        Geminate     8.85 13.7  10.9   9.95  8.42     43       2
    # 13 m:        Geminate    14    14.6  12.4   5.66  5.01     37.7     2
    # 14 n         Singleton    8    15.1   4.44 11.6   8.99     40.2     1
    # 15 n:        Geminate     8.21 21.4  10.1  10.2   9.32     51       2
    # 16 n:        Geminate    11.3  32    10.4   8.09  7.94     58.5     2
    # 17 p         Singleton    8.4  11.2  11.9   7.98  6.53     37.7     1
    # 18 p:        Geminate     8.81 13.2  12.7   8.57 11.3      45.8     1
    # 19 t`        Singleton    9    12.9  10.5   8.69  9.2      41.3     1
    # 20 t`:       Geminate     9    13.1  13.1   8.39 10.6      45.2     1
    

    这是数据集的代码:

    dat <- read.table(
      text = '
      C2_xsampa Consonant Speaker C1.dn C2.dn V1.dn V2.dn total.dn
     1 "d_d"     Singleton    8.5  11.9   7.82 13.0   7.65     40.3
     2 "d_d:"    Geminate     9    11.6  11.9  11.4   7.46     42.3
     3 "dZ"      Singleton    8.31  7.79  7.47 14.9   9.81     40.0
     4 "dZ:"     Geminate     8.08  7.72 13.4  12.8   9.61     43.6
     5 "g"       Singleton    9    12.1  11.3  11.9   8.56     43.9
     6 "g:"      Geminate     8.69 11.3  11.1  12.7  10.2      45.3
     7 "k"       Singleton    9.5  12.3  14.4   9.71  6.97     43.4
     8 "k:"      Geminate     9    14.7  16.1  10.1   7.37     48.2
     9 "l"       Singleton    8.69 11.9   6.33 11.5  10.2      40.0
    10 "l:"      Geminate     8.81 11.3  10.0  10.0  11.5      42.8
    11 "m"       Singleton    8.36 13.6   9.11 11.1   9.20     43.0
    12 "m:"      Geminate     8.85 13.7  10.9   9.95  8.42     43.0
    13 "m: "     Geminate    14    14.6  12.4   5.66  5.01     37.7
    14 "n"       Singleton    8    15.1   4.44 11.6   8.99     40.2
    15 "n:"      Geminate     8.21 21.4  10.1  10.2   9.32     51.0
    16 "n: "     Geminate    11.3  32.0  10.4   8.09  7.94     58.5
    17 "p"       Singleton    8.4  11.2  11.9   7.98  6.53     37.7
    18 "p:"      Geminate     8.81 13.2  12.7   8.57 11.3      45.8
    19 "t`"      Singleton    9    12.9  10.5   8.69  9.20     41.3
    20 "t`:"     Geminate     9    13.1  13.1   8.39 10.6      45.2',
    header = TRUE
    )
    

    【讨论】:

    • “:”、“d_d”等符号是必须的。例如,“:”表示“辅音”列中的“Geminate”值另请参阅我上面对Ray的回复。
    • 感谢您的澄清,@Pranav_b。我已经编辑了代码并保留了冒号。当您计算平均值时,似乎 12/13 和 15/16 是重复的,因为第 13 行和第 16 行中的 m: n: 分别有尾随空格? str_trim() 删除了两端的填充空间。
    • 感谢您提醒我注意输入错误的条目。但是,我无法运行您的代码。它打印一个错误:&lt;error/dplyr:::mutate_error&gt; Problem with mutate()` 输入C2_xsampa。 x 找不到函数“str_trim” i 输入 C2_xsampastr_trim(C2_xsampa)。回溯: 1. %&gt;%(...) 10. base::.handleSimpleError(...) 11. dplyr:::h(simpleError(msg, call)) 运行 rlang::last_trace() 以查看完整的上下文。`我已经手动纠正了“间距”错误。再次感谢。
    • 太棒了!我添加了构建数据集的代码。似乎 stringr 包没有加载,所以 R 找不到 str_trim()。该代码在我的最后运行良好。无论如何,祝你分析顺利!
    • 是的,我必须加载“stringr”包。我是整理诗的新手。我很抱歉。您提供的代码有效。
    【解决方案3】:

    我最喜欢的方法是:

    subset(dat, duplicated(C2_xsampa) | duplicated(rev(C2_xsampa))
    

    【讨论】:

    • 这已经给了我重复的行。错误是关于在“C2_xsampa”列中为值“m:”和“n:”放置的额外空格。提供了解决方案。谢谢你的建议。 :)
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多