r语言 - 删除嵌套的重复项



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

这是数据帧的头部:

> 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

由于这种嵌套(我猜),到目前为止没有任何工作。我尝试了unique, distinct, duplicate,子集,group和slice……我还通过连接只有TuteeID和type或consistency值的2个数据框来创建这个数据框,但是即使这2个较小的数据框没有重复项,全局数据框也有同样的问题。

你有解决办法吗?

我同意@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

好的,我是这样得到这个数据框的:

我有一致性分数矩阵,每个个体对应一种类型的矩阵。对于嵌套循环,我计算了每个矩阵的一致性平均值,它给出了一致性值。循环在第一个列表中保存单个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,并将类型和一致性值分隔成多个列。它给了我类似这样的东西(有更多的Cons列):

> 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合并数据框,得到我在我的问题中显示的数据框。我希望这足够清楚。

最新更新