r - 检查每个具有相同唯一 ID 的唯一值

标签 r dataframe ggplot2 dplyr tidyr

我有一个 excel 表,它看起来像:

Col1    Col2
IJ-123  A2B1
IJ-123  A2B1
IJ-456  C2C2
IJ-456  c2c2
IJ-456  D1e2
IJ-789  LJ87
IJ-456  
IJ-789  LJ98

x = data.frame(
  Col1 = c("IJ-123", "IJ-123", "IJ-456", "IJ-456", 
           "IJ-456", "IJ-789", "IJ-456", "IJ-789"), 
  Col2 = c("A2B1", "A2B1", "C2C2", "c2c2",
           "D1e2", "LJ87", NA, "LJ98")
)

我想再添加一列并检查(对于每个唯一的 Col2 值)在 Col1 中分配的值是 TRUE 还是 FALSE

输出:
Col1    Col2  Result
IJ-123  A2B1  TRUE
IJ-123  A2B1  TRUE
IJ-456  C2C2  TRUE
IJ-456  c2c2  TRUE
IJ-456  D1e2  FALSE
IJ-789  LJ87  TRUE (Because Col2 count=1 for this value)
IJ-456        C2C2
IJ-789  LJ98  TRUE (Because Col2 count=1 for this value)

逻辑:
  • 如果 col2 中的值多于 1,则检查
    那些 col2 值对应的 col1 值是相同的
  • 如果只有一个 col2 值,则检查 col1 是否唯一
    但仅针对多次出现的 col2 值的 col1 值。
  • 如果我们有重复的 Col2,那么 Col1 中的某些字段是空白的
    值比显示映射到结果中的那些 Col2Col1 值(见第 7 行)。

  • 为此,我有一个 excel 公式 =IF(COUNTIF($B$2:$B$8,B2)=1,SUMPRODUCT(--(($A$2:$A$8=A2)*(COUNTIF($B$2:$B$8,$B$2:$B$8))>1))=0,COUNTIFS($B$2:$B$8,B2,$A$2:$A$8,"<>"&A2)=0) 但它的工作速度非常慢,因为等待了大约 4 个小时,它只完成了大约 20 万条数据的 28% 处理。

    我已将 csv 格式的文件上传到 R 上,并希望在 R 上执行相同的练习以加快处理速度。

    最佳答案

    试试 dplyr:

    require(dplyr)
    x$Col2 <- toupper(x$Col2) #make all letters same case.
    
    x_assigned <- x %>% group_by(Col2,Col1) %>% 
    
    summarise(n = n()) %>% #counts the number of occurrences
      group_by(Col1) %>% arrange(desc(n)) %>%  # arranges so that the highest count per Col1 is first
      mutate(assigned = if (first(n) == 1) { #this conditional statement will assign the 'correct' Col2 value to your Col1 value
          Col2
        } else if (first(n) > 1) { 
          first(Col2)
        },
      test = assigned == Col2)
    
    x_assigned
    
    # A tibble: 6 x 5
    # Groups:   Col1 [3]
      Col2  Col1      n assigned test 
      <chr> <chr> <int> <chr>    <lgl>
    1 A2B1  I-123     2 A2B1     T    
    2 C2C2  I-456     2 C2C2     T    
    3 D1E2  I-456     1 C2C2     F    
    4 LJ87  I-789     1 LJ87     T    
    5 LJ98  I-789     1 LJ98     T    
    6 <NA>  I-456     1 C2C2     NA  
    

    为了获得所需的结果,您可以对 x 和 x_assigned 进行简单的左连接:
    left_join(x, x_assigned, by = c('Col1', 'Col2'))
    

    您可以通过这种方式查看缺失值的位置,还可以轻松分配“正确”的 Col2 值。抱歉,如果我误解了您的问题,我仍然不确定您如何将“正确”的 Col2 值分配给 Col1 值

    关于r - 检查每个具有相同唯一 ID 的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48849294/

    相关文章:

    从函数返回方程

    r - 根据名称循环数据框

    python - 复制列并将结果与​​另一个数据框连接

    python - 根据每个数据帧中的值对数据帧列表中数据帧的顺序进行排序

    r - 如何在ggplot2中混合aes_()和算术计算?

    macos - R包安装在所有机器上成功,但一台

    r - x[[jj]] <- v : attempt to select less than one element in integerOneIndex 中的错误

    python - 值错误 : Mixing dicts with non-Series may lead to ambiguous ordering

    r - 增加 ggplot2 中图例演示的中断

    r - 如何从绘制的线性模型中获取更平滑的参数?