更改某些计数器值的列值

时间:2013-03-13 05:28:45

标签: r

我正在使用如下循环读取数据:

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

然后,我正在做一堆数据(获取修剪手段等),然后输入主表,其中包含每个文件的平均值。我稍后会对手段进行方差分析。

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

由于

2 个答案:

答案 0 :(得分:3)

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

如果你a <- b然后b <- a,他们最终会得到相同的价值。 您需要执行TMP <- a a <- b b <- TMP

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

答案 1 :(得分: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
                        )

显然我没有你的实际数据来检查我没有犯错,但这只是那种对我来说非常好的工作流程。