Цикл по вектору (самоанализ в R?) Или какой-то другой подход - PullRequest
3 голосов
/ 15 февраля 2011

У меня есть таблица 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')?Или есть какой-то другой подход?

A Решение: split

Используя split, вышесказанное легко может быть достигнуто только одной строкой:

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

Где:

  • split переставляет данные в tf$IL в соответствии со второй частью аргумента;
  • paste объединяет элементы после их преобразованияна string;
  • tolower меняет символы на строчные.

Результат в fvowels представляет собой набор данных от f1a до f3u.

Ответы [ 2 ]

3 голосов
/ 15 февраля 2011

Используя этот набор данных:

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

Но splitMarek, вероятно, лучший способ сделать это:)

3 голосов
/ 15 февраля 2011

Взгляните на 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 переписать список или легко его сохранить).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...