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")
......

然后,我对数据做了一堆东西(得到修剪手段等),然后输入一个包含每个文件平均值的主表。稍后我将在均值上进行方差分析。

无论如何,我需要反转某些文件(or 语句中的那些)的分数以使它们等效(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

2 回答 2

3

如果你想换掉东西,你需要暂时把它们放在某个地方。

如果你这样做 了a <- b,那么b <- a 它们最终都会得到相同的值。你需要改为 TMP <- a a <- b b <- TMP

至于or声明,您可能正在寻找%in%@sebastian-c 指出的。

于 2013-03-13T05:42:57.480 回答
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
                        )

显然,我没有您的实际数据可以用来检查我没有犯错,但这只是现在对我来说运行良好的工作流程。

于 2013-03-13T05:53:10.210 回答