经过多次尝试,我成功地将嵌套的结果列表转换为一个数据框架。问题是在这个数据框架中有嵌套的重复项,无论我尝试哪种代码,我都无法解决这个问题。
这是数据帧的头部:
> 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
合并数据框,得到我在我的问题中显示的数据框。我希望这足够清楚。