循环过矢量(R?中的内省)或其他一些方法

时间:2011-02-15 10:50:33

标签: r loops

我有一个tf个表格,其列标题为formant vowel length IL SG

这就是我获得价值的方式:

f1a <- subset(tf, tf$vowel=='a' & tf$formant=='F1')$IL
f2a <- subset(tf, tf$vowel=='a' & tf$formant=='F2')$IL

f1e <- subset(tf, tf$vowel=='e' & tf$formant=='F1')$IL
f2e <- subset(tf, tf$vowel=='e' & tf$formant=='F2')$IL

有没有办法用给定vowels <- c('a', 'e', 'i', 'o', 'u')的循环重写这个?还是有其他方法吗?

解决方案:split

通过使用split,上述内容只需一行即可轻松实现:

fvowels = split(tf$IL, paste(tolower(tf$formant), tf$vowel, sep=""))

其中:

  • split根据论点的第二部分重新调整tf$IL中的数据;
  • paste将项目转换为string;
  • 后加入项目
  • tolower将字符更改为小写。

fvowels中的结果是从f1af3u的一组数据。

2 个答案:

答案 0 :(得分:3)

查看split

tf <- data.frame(
  formant = sample(c("F1","F2"), 100, T),
  vowels = sample(c('a', 'e', 'i', 'o', 'u'), 100, T),
  IL = runif(100)
)
split(tf$IL, paste(tolower(tf$formant), tf$vowels, sep=""))

它为您提供带有分隔数据的命名列表。如果你想把它作为单独的变量,你可以assignattach到全局工作空间,但我建议改用列表(你可以例如lapply超过列表或保存它)。

答案 1 :(得分:3)

使用此数据集:

tf <- data.frame(formant=c("F1","F2"),vowel=c('a', 'e', 'i', 'o', 'u'),IL=rnorm(100))

vowel<-c('a', 'e', 'i', 'o', 'u')

然后for循环将是:

for (i in vowel){
    assign(paste("F1",i,sep=""),subset(tf, tf$vowel==i & tf$formant=='F1')$IL)
    assign(paste("F2",i,sep=""),subset(tf, tf$vowel==i & tf$formant=='F2')$IL)
}

F1e
F2a

另一种选择,使用plyr:

library(plyr)
foo<-dlply(tf,.(formant,vowel),function(x)x$IL)

foo$F1.e
foo$F2.a

但Marek使用的分割可能是最好的方法:)