我有一个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
中的结果是从f1a
到f3u
的一组数据。
答案 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=""))
它为您提供带有分隔数据的命名列表。如果你想把它作为单独的变量,你可以assign
或attach
到全局工作空间,但我建议改用列表(你可以例如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使用的分割可能是最好的方法:)