如何在 R 中将多列转换为单独的行

2024-01-09

我在 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()定义)执行此操作时,我最终得到了超过200k个项目的列表,其中许多是NA。当我在 178100x8 数据帧中将norm.all定义为数据帧(空的1或全0之一)时,出现错误:

错误于$<-.data.frame(*tmp*, "Speaker", value = 105L) : 替换有 1 行,数据有 0

我的代码完全关闭了吗?还有其他方法可以做到这一点吗?


Use melt来自“重塑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”包以获得一点速度提升。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 R 中将多列转换为单独的行 的相关文章

随机推荐