我在R 2与F0(基波频率)在它的一个发声的磁道的数据帧,其具有许多行(3000)。行中都有以下信息:扬声器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数据帧。我想每列数据(,文字经过这么1:50),以改变它,在F0轨道都有自己的专栏,与相关联的列数为另一行。我希望将所有的前6列,其中每一数据点的信息一样,所以它看起来是这样的:
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作为数据帧(一个空一个或全部为0的一个,在178100x8数据帧,我得到一个错误:
误差在
$<-.data.frame
(*tmp*
, “扬声器”,值= 105L):更换具有1行,数据具有0
是我的代码只是完全关闭?是否有另一种方式做到这一点?
从“reshape2”使用melt
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”包变得有点提升速度的。
随着reshape
:
x <- read.table(header=T, text="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")
reshape(x, direction="long", sep='', varying=paste0('X', 1:4))
## Speaker Sex Group Repetition Accent Word time X id
## 1.1 105 M 1 1 N AILMENT 1 102.3103 1
## 2.1 105 M 1 1 N COLLEGE 1 111.8064 2
## 3.1 105 M 1 1 N FATHER 1 124.0666 3
## 1.2 105 M 1 1 N AILMENT 2 102.3103 1
## 2.2 105 M 1 1 N COLLEGE 2 111.8031 2
## 3.2 105 M 1 1 N FATHER 2 124.0666 3
## 1.3 105 M 1 1 N AILMENT 3 102.3103 1
## 2.3 105 M 1 1 N COLLEGE 3 111.6861 2
## 3.3 105 M 1 1 N FATHER 3 124.0666 3
## 1.4 105 M 1 1 N AILMENT 4 102.3113 1
## 2.4 105 M 1 1 N COLLEGE 4 111.3602 2
## 3.4 105 M 1 1 N FATHER 4 124.0666 3