识别并标记 r 中的重复行

Hea*_*ark 12 r dataframe

我想根据 2 列识别和标记重复的行。我想为每个重复项创建一个唯一标识符,这样我不仅知道该行是重复的,而且知道它与哪一行重复。我有一个如下所示的数据框,其中包含一些重复的项目对(适合和坐下)和其他不重复的项目对。虽然项目对是重复的,但它们包含的信息是唯一的(例如,一行将在 Value1 中为 1 行提供一个值,但在 Value2 和 Value 3 中没有,第二行或“重复”行将只为 Value2 和 Value3 提供数字不是价值 1)

当前数据框

     value1 value2 value3 fit   sit  
[1,] "1"    NA     NA     "it1" "it2"
[2,] NA     "3"    "2"    "it2" "it1"
[3,] "2"    "3"    "4"    "it3" "it4"
[4,] NA     NA     NA     "it4" "it3"
[5,] "5"    NA     NA     "it5" "it6"
[6,] NA     NA     "2"    "it6" "it5"
[7,] NA     "4"    NA     "it7" "it9"
Run Code Online (Sandbox Code Playgroud)

生成示例数据帧的代码

value1<-c(1,NA,2,NA,5,NA,NA)
value2<-c(NA,3,3,NA,NA,NA, 4)
value3<-c(NA,2,4,NA,NA,2, NA)
fit<-c("it1","it2","it3","it4", "it5", "it6","it7")
sit<-c("it2","it1","it4","it3", "it6", "it5", "it9")
df.now<-cbind(value1,value2,value3, fit, sit)
Run Code Online (Sandbox Code Playgroud)

我想要的是将其转换为如下所示的数据框:

所需的数据框

     val1 val2 val3 it1   it2  
[1,] "1"  "3"  "2"  "it1" "it2"
[2,] "2"  "3"  "4"  "it3" "it4"
[3,] "5"  NA   "2"  "it5" "it6"
[4,] NA   "4"  NA   "it7" "it9"
Run Code Online (Sandbox Code Playgroud)

我正在考虑执行以下步骤:1. 使用 fit 创建新变量并与最低项目和最高项目坐在一起以识别重复对 2. 识别重复项目对 3. 使用 ifelse 选择并填写唯一信息。

我知道如何执行第 1 步和第 3 步,但我仍停留在第 2 步。我认为我需要做的不仅仅是识别 TRUE/FALSE 重复项,而且可能为每个项目对设置一个具有唯一标识符的列,例如(有由于我的步骤 1),多出了 2 行:

     value1 value2 value3 fit   sit   lit   hit    dup
[1,] "1"    NA     NA     "it1" "it2" "it1" "it2"   1
[2,] NA     "3"    "2"    "it2" "it1" "it1" "it2"   1
[3,] "2"    "3"    "4"    "it3" "it4" "it3" "it4"   2
[4,] NA     NA     NA     "it4" "it3" "it3" "it4"   2
[5,] "5"    NA     NA     "it5" "it6" "it5" "it6"   3
[6,] NA     NA     "2"    "it6" "it5" "it5" "it6"   3
[7,] NA     "4"    NA     "it7" "it9" "it7" "it9"   NA
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做。

我所要求的是对第 2 步的帮助,或者也许有比我概述的步骤更好的解决方法。

tmf*_*mnk 6

一种dplyr选择可能是:

df.now %>%
 group_by(pair = paste(pmax(fit, sit), pmin(fit, sit), sep = "_")) %>%
 summarise_at(vars(starts_with("value")), ~ ifelse(all(is.na(.)), 
                                                   NA,
                                                   first(na.omit(.))))

  pair    value1 value2 value3
  <chr>    <dbl>  <dbl>  <dbl>
1 it2_it1      1      3      2
2 it4_it3      2      3      4
3 it6_it5      5     NA      2
4 it9_it7     NA      4     NA
Run Code Online (Sandbox Code Playgroud)

如果您还需要单独列中的对,那么添加tidyr您可以执行以下操作:

df.now %>%
 group_by(pair = paste(pmax(fit, sit), pmin(fit, sit), sep = "_")) %>%
 summarise_at(vars(starts_with("value")), ~ ifelse(all(is.na(.)), 
                                                   NA,
                                                   first(na.omit(.)))) %>%
 separate(pair, into = c("fit", "hit"), sep = "_", remove = FALSE)

  pair    fit   hit   value1 value2 value3
  <chr>   <chr> <chr>  <dbl>  <dbl>  <dbl>
1 it2_it1 it2   it1        1      3      2
2 it4_it3 it4   it3        2      3      4
3 it6_it5 it6   it5        5     NA      2
4 it9_it7 it9   it7       NA      4     NA
Run Code Online (Sandbox Code Playgroud)