2013-03-13 4 views
0

Читаю в данных с петлей, как так:Изменение значений столбцов для определенного значения счетчика

for(i in 1:2) 
{ 
n= paste(i,".txt", sep="") 
a<- sprintf("table%d", i, i) 
data <- read.table(toString(n), header = TRUE, sep = "\t") 
...... 

Затем я делаю кучу вещей для данных (получение обрезается средства и такое), то кормление в основную таблицу, которая содержит средние значения для каждого файла. Я сделаю ANOVA на средства позже.

Во всяком случае, мне нужно изменить оценки на определенные файлы (те, что указаны в инструкции или), чтобы сделать их эквивалентными (от a до b и b до a). Вот как я это делал, но выглядит довольно глупо, есть ли более простой синтаксис?

if (i ==(2|4|6|7|9|11|14|16|18|19|21|23|25|28|30|32|34|36)) 
{ 
data$Reqresponse[data$Reqresponse == "a"] <- "nw" 
data$Reqresponse[data$Reqresponse == "b"] <- "w" 
data$Reqresponse[data$Reqresponse == "nw"] <- "b" 
data$Reqresponse[data$Reqresponse == "w"] <- "a" 
} 

Благодаря

+4

Я не уверен, что ваш код делает то, что вы думаете. Я предполагаю, что вы хотите запустить оператор if для значений i, соответствующих указанным вами цифрам? – Dason

+3

Вы хотите что-то вроде 'i% in% c (2,4,6,7,9,11,14,16,18,19,21,23,25,28,30,32,34,36)' ? –

+0

@Dason: http://www.youtube.com/watch?v=1-b7RmmMJeo –

ответ

3

если вы пытаетесь поменять вещи, вы должны поместить их куда-то временно.

Если вы делаете a <- b, а затем b <- a, они оба будут иметь одинаковое значение. Вы должны вместо этого сделать TMP <- aa <- bb <- TMP

Как для or заявления, вы, вероятно, ищет %in%, как @ Себастиан-с указывает.

1

Что вы делаете, так это то, как я приближался к вещам, прежде чем обнаружил plyr. Вот как я сейчас подхожу к подобным ситуациям. Вероятно, есть люди, которые могут показать вам более быстрые пути, но вот как я буду заниматься вашей ситуацией.

library(plyr) 

#Assuming all your files are in the working directory 
filenames <- list.files(".", ".txt") 
#Assuming your files are "1.txt" etc 
file.index <- sub("([0-9]+).txt", "\\1", filenames) 
#reads in all the files 
import <- mdply(filenames, read.table, header = TRUE, sep = "\t") 
#Assigns the index to each group of rows from each file 
import$index <- file.index[import$X1] 

#Gives you one big table to work with. 
#Fix your reversing issue 
import$Reqresponse.alt[import$Reqresponse == "a" & import$index %in% c(2,4,6,7,9,11,14,16,18,19,21,23,25,28,30,32,34,36)] <- "b" 
import$Reqresponse.alt[import$Reqresponse == "b" & import$index %in% c(2,4,6,7,9,11,14,16,18,19,21,23,25,28,30,32,34,36)] <- "a" 

import$Reqresponse <- import$Reqresponse.alt 
import$Reqresponse.alt <- NULL 

#Now your table should be clean 
#You can use plyr to to summarise your data 

import.summary <- ddply(import, .(index), summarise, 
         demo.mean = mean(demo), #functions you want to summarise with go here 
         demo.sd = sd(demo), 
         #etc 
         ) 

Очевидно, что я не фактические данные, чтобы работать с, чтобы проверить, что я не сделал ошибки, но это как раз то, что рабочий процесс функционирует очень хорошо для меня.

+0

Нет проблем ..... – alexwhan

+1

Жестко читать ваши комментарии, когда вы помещаете их в одну строку кода. Вы можете подумать о переносе комментариев к строке перед кодом ... – Dason

+0

Спасибо за отзыв, я возьму его на борт – alexwhan

Смежные вопросы