【问题标题】:Removing nested duplicates删除嵌套重复项
【发布时间】:2021-11-27 09:30:11
【问题描述】:

经过多次试验,我设法将嵌套的结果列表转换为数据框。问题是这个dataframe中有嵌套的重复,无论我尝试哪种代码,我都无法解决问题。

这是数据框的头部:

> df[1:12]
    TuteeID Tutee_Type Tutee_Syll_Cons
 1:    G313          A       0.7020889
 2:    G313          A       0.7573333
 3:    G313          A       0.7731556
 4:    G313          C       0.7020889
 5:    G313          C       0.7573333
 6:    G313          C       0.7731556
 7:    G313          D       0.7020889
 8:    G313          D       0.7573333
 9:    G313          D       0.7731556
10:    G315          B       0.7762000
11:    G315          B       0.8324222
12:    G315          B       0.8560222

举例说明,对于单个 G313,我有 A、C 和 D 类型以及每种类型的一个一致性值。但在我的数据框中,每个一致性值都分配给每种类型。我需要这样的东西:

> df2
  TuteeID Tutee_Type Tutee_Syll_cons
1    G313          A       0.7020889
2    G313          C       0.7573333
3    G313          D       0.7731556
4    G315          B       0.7762000

由于这种嵌套(我猜),到目前为止没有任何效果。我尝试了唯一、不同、重复、子集、组和切片......我还通过加入 2 个只有 TuteeID 和类型或一致性值的数据帧来创建这个数据帧,但即使这 2 个较小的数据帧没有重复,全局数据帧也有同样的问题。

你有解决办法吗?

【问题讨论】:

  • 他们取消嵌套列表的方式是创建笛卡尔积。最好更改该逻辑,而不是稍后尝试修复它。最好提供以原始格式创建 df[1:12] 的数据以及如何将其转换为 df,我们可以找出将其更改为 df2

标签: r dataframe nested duplicates


【解决方案1】:

我同意@Robin 的建议,最好在上游解决这个问题,而不是稍后修复它。

但是,如果您收到了这种格式的数据,或者您无法更改较早的数据,这里是一种仅获取所需部分数据的方法。

library(dplyr)

df %>%
  group_by(TuteeID) %>%
  mutate(index = match(Tutee_Type, unique(Tutee_Type))) %>%
  group_by(index, .add = TRUE) %>%
  slice(first(index)) %>%
  select(-index) %>%
  ungroup

#  index TuteeID Tutee_Type Tutee_Syll_Cons
#  <int> <chr>   <chr>                <dbl>
#1     1 G313    A                    0.702
#2     2 G313    C                    0.757
#3     3 G313    D                    0.773
#4     1 G315    B                    0.776

【讨论】:

  • 非常感谢!它给了我一些非常令人满意的东西,但是固定数据帧的行数比预期的要少(289 行而不是 338 行)。有些行可能已被删除...
【解决方案2】:

好的,这就是我得到这个数据框的方式:

我有一致性分数矩阵,每个人的每种类型都有一个矩阵。使用嵌套循环,我计算了每个矩阵的一致性平均值,它给了我一致性值。保存在第一个中的循环列出了个人 ID,在第二个中列出了类型,在第三个中列出了一致性值。第二个和第三个列表的元素大小不相等,因为个体的类型数量不同。

我是从这个开始的。包含 3 个数据列表的列表称为“myresults”。

syll_cons <- do.call(cbind, myresults)
syll_cons2 <- as.data.frame(syll_cons)

> Syll_cons2
  TuteeID Tutee_Type                        Tutee_Syll_cons
1    G313        ACD                 0.7020, 0.7573, 0.7731
2    G315        BCD                 0.7762, 0.8324, 0.8560
3    G322      ABCDE 0.7151, 0.8044, 0.6102, 0.7546, 0.7893
4    G323          C                                 0.5845

然后我使用tidyr::separate 并将类型和一致性值分成多个列。它给了我类似的东西(有更多的缺点列):

> head(syll_cons3)
    ID T1   T2   T3   T4   T5              Cons1              Cons2  
1 G313  A    C    D <NA> <NA>  0.702088888888889  0.757333333333333  
2 G315  B    C    D <NA> <NA>             0.7762  0.832422222222222  
3 G322  A    B    C    D    E  0.715155555555556  0.804466666666667  
4 G323  C <NA> <NA> <NA> <NA>  0.584555555555556               <NA>               
5 G325  A    B    C    D    E  0.829177777777778  0.921266666666667  
6 G326  C    D <NA> <NA> <NA>  0.621666666666667  0.709533333333333               

然后我使用pivot_longer 将这些多列转换为行。我为类型创建了一个数据框,为一致性值创建了一个:

syllable_cons <- pivot_longer(syll_cons3, starts_with("Cons"), values_to = "Syll_cons")
syllable_cons <- syllable_cons[complete.cases(syllable_cons$Syll_cons), ]
syllable_cons2 <- pivot_longer(syll_cons3, starts_with("T"), values_to = "Tutee_Type")
syllable_cons2 <- syllable_cons2[complete.cases(syllable_cons2$Tutee_Type), ]

syllable_cons <- syllable_cons[,c(1,10)]
syllable_cons2 <- syllable_cons2[,c(1,10)]

> head(syllable_cons)
  ID    Syll_cons
1 G313      0.702
2 G313      0.757
3 G313      0.773
4 G315      0.776
5 G315      0.832
6 G315      0.856

> head(syllable_cons2)
  ID    Tutee_Type  
1 G313  A         
2 G313  C         
3 G313  D         
4 G315  B         
5 G315  C         
6 G315  D 

最后我使用full_join 合并数据框并获得我在问题中显示的数据框。我希望它足够清楚。

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多