gpt4 book ai didi

r - 如何将多列转换为R中的单行

转载 作者:行者123 更新时间:2023-12-04 17:00:55 24 4
gpt4 key购买 nike

我在 R 中有一个数据框,它有很多行(超过 3000 行),其中包含 F0(基本频率)音轨。这些行中包含以下信息:说话者 ID、组号、重复 #、重音类型、性别,然后是 50 列 F0 点。数据如下所示:

Speaker Sex Group Repetition Accent    Word         1         2         3        4
105 M 1 1 N AILMENT 102.31030 102.31030 102.31030 102.31127
105 M 1 1 N COLLEGE 111.80641 111.80313 111.68612 111.36020
105 M 1 1 N FATHER 124.06655 124.06655 124.06655 124.06655

但不是只去 X4,它每行有 50 个点,所以我有一个 3562x56 的数据框。我想更改它,以便 F0 轨道中的每一列数据(所以在单词之后,从 1:50 开始)都有自己的列,关联的列号作为另一行。我还想将所有信息保留在每个数据点的前六列中,因此它看起来像这样:
Speaker Sex Group Repetition Accent    Word       Num        F0
105 M 1 1 N AILMENT 1 102.31030
105 M 1 1 N AILMENT 2 102.31030
105 M 1 1 N AILMENT 3 102.31030
105 M 1 1 N AILMENT 4 102.31127
...
105 M 1 1 N COLLEGE 1 111.80641
105 M 1 1 N COLLEGE 1 111.80313
105 M 1 1 N COLLEGE 1 111.68612
105 M 1 1 N COLLEGE 1 111.36020
...

我尝试使用的代码虽然乏味,但如下:

x = 1
for (i in 1:dim(normrangef0)[1]) {
for (j in 1:50) {
norm.all$Speaker[x] <- normrangef0$Speaker[i]
norm.all$Sex[x] <- normrangef0$Sex[i]
norm.all$Group[x] <- normrangef0$Group[i]
norm.all$Repetition[x] <- normrangef0$Repetition[i]
norm.all$Word[x] <- normrangef0$Word[i]
norm.all$Accent[x] <- normrangef0$Accent[i]
norm.all$Time[x] <- j
norm.all$F0[x] <- normrangef0[i,j+6]
x = x+1
}
}

但是,当我将 norm.all 作为 NULL 对象(仅由 norm.all = c() 定义)执行此操作时,我最终得到了超过 20 万个项目的列表,其中许多是 NA。当我将 norm.all 定义为数据帧(在 178100x8 数据帧中,无论是空的还是全 0 的一个),我收到一个错误:

Error in $<-.data.frame(*tmp*, "Speaker", value = 105L) : replacement has 1 row, data has 0



我的代码完全关闭了吗?有没有另一种方法可以做到这一点?

最佳答案

使用 melt来自“ reshape 2”

library(reshape2)
melt(mydf, id.vars=c("Speaker", "Sex", "Group", "Repetition", "Accent", "Word"))
# Speaker Sex Group Repetition Accent Word variable value
# 1 105 M 1 1 N AILMENT 1 102.3103
# 2 105 M 1 1 N COLLEGE 1 111.8064
# 3 105 M 1 1 N FATHER 1 124.0666
# 4 105 M 1 1 N AILMENT 2 102.3103
# 5 105 M 1 1 N COLLEGE 2 111.8031
# 6 105 M 1 1 N FATHER 2 124.0666
# 7 105 M 1 1 N AILMENT 3 102.3103
# 8 105 M 1 1 N COLLEGE 3 111.6861
# 9 105 M 1 1 N FATHER 3 124.0666
# 10 105 M 1 1 N AILMENT 4 102.3113
# 11 105 M 1 1 N COLLEGE 4 111.3602
# 12 105 M 1 1 N FATHER 4 124.0666

在基础 R 中,您还可以使用 stack堆叠名为 1 到 4 的列,以及 cbind与第一组列。或者, unlist也会这样做。

您可能还想查看“data.table”包以获得一些速度提升。

关于r - 如何将多列转换为R中的单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20464107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com