Hi R Users,
I have been struggling to replace texts in a table by new text. but it
seems crazy as of I am doing it manually in R. I have very big files and
some of the text has to be replaced by another class based on another file
if the name corresponds. I was able to perform following example but it
should be easier if there is a loop. Any suggestions on making a loop for
this example?
Here is the example how I did. I want to assign class into dat1 based on
dat2 table.
dat1<-structure(list(ID = structure(1:8, .Label = c("X127",
"X128",
"X129", "X130", "X131", "X132",
"X133", "X134"), class = "factor"),
Name = structure(1:8, .Label = c("Site1", "Site2",
"Site3",
"Site4", "Site5", "Site6", "Site7",
"Site8"), class = "factor"),
Time1 = structure(c(4L, 2L, 3L, 5L, 1L, 1L, 4L, 5L), .Label =
c("0",
"GT", "R", "Tr", "W2"), class =
"factor"), Time2 = structure(c(2L,
1L, 4L, 2L, 1L, 3L, 4L, 1L), .Label = c("0", "GT",
"MA",
"UA"), class = "factor"), Time3 = structure(c(5L, 1L,
4L,
4L, 2L, 3L, 3L, 1L), .Label = c("0", "GT",
"R", "Tr", "Y7"
), class = "factor")), .Names = c("ID",
"Name", "Time1",
"Time2", "Time3"), class = "data.frame", row.names
= c(NA, -8L
))
dat1
dat2<-structure(list(site = structure(c(4L, 2L, 5L, 3L, 6L, 7L, 8L,
1L), .Label = c("GT", "MA", "R", "Tr",
"UA", "W1", "W2", "Y7"
), class = "factor"), To.be.assinged = structure(c(1L, 2L, 3L,
1L, 4L, 4L, 1L, 2L), .Label = c("A", "B", "C",
"D"), class = "factor")),
.Names = c("site",
"To.be.assinged"), class = "data.frame", row.names = c(NA,
-8L
))
dat2
A2 <- as.data.frame(lapply(dat1,function(x)
if(is.character(x)|is.factor(x)) gsub("Tr","A",x) else x))
A3 <- as.data.frame(lapply(A2,function(x) if(is.character(x)|is.factor(x))
gsub("MA","B",x) else x))
A4 <- as.data.frame(lapply(A3,function(x) if(is.character(x)|is.factor(x))
gsub("UA","C",x) else x))
A5 <- as.data.frame(lapply(A4,function(x) if(is.character(x)|is.factor(x))
gsub("R","A",x) else x))
A6 <- as.data.frame(lapply(A5,function(x) if(is.character(x)|is.factor(x))
gsub("W1","D",x) else x))
A7 <- as.data.frame(lapply(A6,function(x) if(is.character(x)|is.factor(x))
gsub("W2","D",x) else x))
A8 <- as.data.frame(lapply(A7,function(x) if(is.character(x)|is.factor(x))
gsub("Y7","A",x) else x))
A9 <- as.data.frame(lapply(A8,function(x) if(is.character(x)|is.factor(x))
gsub("GT","B",x) else x))
A9
Your help is highly appreciated.
Thanks
[[alternative HTML version deleted]]
Thanks for the complete reproducible example.
Here's one way to approach the problem; there are many others.
recodeDat <- function(x, invals, outvals) {
x <- as.character(x)
invals <- as.character(invals)
outvals <- as.character(outvals)
# a loop is the most understandable approach
for(i in seq_along(invals)) {
x[x == invals[i]] <- outvals[i]
}
# I would change the zeros to NA values
x[x == "0"] <- NA
factor(x, levels=sort(unique(outvals)))
}
dat1.recode <- dat1
dat1.recode[, 3:ncol(dat1.recode)] <- apply(dat1.recode[,
3:ncol(dat1.recode)], 2, recodeDat, invals=dat2[,1], outvals=dat2[,2])
On Tue, Mar 8, 2016 at 4:26 PM, Marna Wagley <marna.wagley at gmail.com>
wrote:> Hi R Users,
> I have been struggling to replace texts in a table by new text. but it
> seems crazy as of I am doing it manually in R. I have very big files and
> some of the text has to be replaced by another class based on another file
> if the name corresponds. I was able to perform following example but it
> should be easier if there is a loop. Any suggestions on making a loop for
> this example?
>
> Here is the example how I did. I want to assign class into dat1 based on
> dat2 table.
>
> dat1<-structure(list(ID = structure(1:8, .Label = c("X127",
"X128",
> "X129", "X130", "X131", "X132",
"X133", "X134"), class = "factor"),
> Name = structure(1:8, .Label = c("Site1", "Site2",
"Site3",
> "Site4", "Site5", "Site6",
"Site7", "Site8"), class = "factor"),
> Time1 = structure(c(4L, 2L, 3L, 5L, 1L, 1L, 4L, 5L), .Label =
c("0",
> "GT", "R", "Tr", "W2"), class =
"factor"), Time2 = structure(c(2L,
> 1L, 4L, 2L, 1L, 3L, 4L, 1L), .Label = c("0", "GT",
"MA",
> "UA"), class = "factor"), Time3 = structure(c(5L,
1L, 4L,
> 4L, 2L, 3L, 3L, 1L), .Label = c("0", "GT",
"R", "Tr", "Y7"
> ), class = "factor")), .Names = c("ID",
"Name", "Time1",
> "Time2", "Time3"), class = "data.frame",
row.names = c(NA, -8L
> ))
>
> dat1
>
> dat2<-structure(list(site = structure(c(4L, 2L, 5L, 3L, 6L, 7L, 8L,
> 1L), .Label = c("GT", "MA", "R",
"Tr", "UA", "W1", "W2", "Y7"
> ), class = "factor"), To.be.assinged = structure(c(1L, 2L, 3L,
> 1L, 4L, 4L, 1L, 2L), .Label = c("A", "B",
"C", "D"), class = "factor")),
> .Names = c("site",
> "To.be.assinged"), class = "data.frame", row.names =
c(NA, -8L
> ))
> dat2
>
> A2 <- as.data.frame(lapply(dat1,function(x)
> if(is.character(x)|is.factor(x)) gsub("Tr","A",x) else
x))
> A3 <- as.data.frame(lapply(A2,function(x)
if(is.character(x)|is.factor(x))
> gsub("MA","B",x) else x))
> A4 <- as.data.frame(lapply(A3,function(x)
if(is.character(x)|is.factor(x))
> gsub("UA","C",x) else x))
> A5 <- as.data.frame(lapply(A4,function(x)
if(is.character(x)|is.factor(x))
> gsub("R","A",x) else x))
> A6 <- as.data.frame(lapply(A5,function(x)
if(is.character(x)|is.factor(x))
> gsub("W1","D",x) else x))
> A7 <- as.data.frame(lapply(A6,function(x)
if(is.character(x)|is.factor(x))
> gsub("W2","D",x) else x))
> A8 <- as.data.frame(lapply(A7,function(x)
if(is.character(x)|is.factor(x))
> gsub("Y7","A",x) else x))
> A9 <- as.data.frame(lapply(A8,function(x)
if(is.character(x)|is.factor(x))
> gsub("GT","B",x) else x))
> A9
>
> Your help is highly appreciated.
> Thanks
>
--
Sarah Goslee
http://www.functionaldiversity.org
> On Mar 8, 2016, at 1:48 PM, Sarah Goslee <sarah.goslee at gmail.com> wrote: > > Thanks for the complete reproducible example. > > Here's one way to approach the problem; there are many others. > > recodeDat <- function(x, invals, outvals) { > x <- as.character(x) > invals <- as.character(invals) > outvals <- as.character(outvals) > # a loop is the most understandable approach > for(i in seq_along(invals)) { > x[x == invals[i]] <- outvals[i] > } > # I would change the zeros to NA values > x[x == "0"] <- NA > > factor(x, levels=sort(unique(outvals))) > } > > dat1.recode <- dat1 > dat1.recode[, 3:ncol(dat1.recode)] <- apply(dat1.recode[, > 3:ncol(dat1.recode)], 2, recodeDat, invals=dat2[,1], outvals=dat2[,2])Here's an lapply approach that gives the same result (complete with the misspelling of 'assigned': dat1[3:5] <- lapply(dat1[3:5], function(x) dat2$To.be.assinged[ match( x, dat2$site) ]) dat1 `match` is designed for generating selection vectors and does not need preceding calls to as.character for factors. -- Best; David.> > On Tue, Mar 8, 2016 at 4:26 PM, Marna Wagley <marna.wagley at gmail.com> wrote: >> Hi R Users, >> I have been struggling to replace texts in a table by new text. but it >> seems crazy as of I am doing it manually in R. I have very big files and >> some of the text has to be replaced by another class based on another file >> if the name corresponds. I was able to perform following example but it >> should be easier if there is a loop. Any suggestions on making a loop for >> this example? >> >> Here is the example how I did. I want to assign class into dat1 based on >> dat2 table. >> >> dat1<-structure(list(ID = structure(1:8, .Label = c("X127", "X128", >> "X129", "X130", "X131", "X132", "X133", "X134"), class = "factor"), >> Name = structure(1:8, .Label = c("Site1", "Site2", "Site3", >> "Site4", "Site5", "Site6", "Site7", "Site8"), class = "factor"), >> Time1 = structure(c(4L, 2L, 3L, 5L, 1L, 1L, 4L, 5L), .Label = c("0", >> "GT", "R", "Tr", "W2"), class = "factor"), Time2 = structure(c(2L, >> 1L, 4L, 2L, 1L, 3L, 4L, 1L), .Label = c("0", "GT", "MA", >> "UA"), class = "factor"), Time3 = structure(c(5L, 1L, 4L, >> 4L, 2L, 3L, 3L, 1L), .Label = c("0", "GT", "R", "Tr", "Y7" >> ), class = "factor")), .Names = c("ID", "Name", "Time1", >> "Time2", "Time3"), class = "data.frame", row.names = c(NA, -8L >> )) >> >> dat1 >> >> dat2<-structure(list(site = structure(c(4L, 2L, 5L, 3L, 6L, 7L, 8L, >> 1L), .Label = c("GT", "MA", "R", "Tr", "UA", "W1", "W2", "Y7" >> ), class = "factor"), To.be.assinged = structure(c(1L, 2L, 3L, >> 1L, 4L, 4L, 1L, 2L), .Label = c("A", "B", "C", "D"), class = "factor")), >> .Names = c("site", >> "To.be.assinged"), class = "data.frame", row.names = c(NA, -8L >> )) >> dat2 >> >> A2 <- as.data.frame(lapply(dat1,function(x) >> if(is.character(x)|is.factor(x)) gsub("Tr","A",x) else x)) >> A3 <- as.data.frame(lapply(A2,function(x) if(is.character(x)|is.factor(x)) >> gsub("MA","B",x) else x)) >> A4 <- as.data.frame(lapply(A3,function(x) if(is.character(x)|is.factor(x)) >> gsub("UA","C",x) else x)) >> A5 <- as.data.frame(lapply(A4,function(x) if(is.character(x)|is.factor(x)) >> gsub("R","A",x) else x)) >> A6 <- as.data.frame(lapply(A5,function(x) if(is.character(x)|is.factor(x)) >> gsub("W1","D",x) else x)) >> A7 <- as.data.frame(lapply(A6,function(x) if(is.character(x)|is.factor(x)) >> gsub("W2","D",x) else x)) >> A8 <- as.data.frame(lapply(A7,function(x) if(is.character(x)|is.factor(x)) >> gsub("Y7","A",x) else x)) >> A9 <- as.data.frame(lapply(A8,function(x) if(is.character(x)|is.factor(x)) >> gsub("GT","B",x) else x)) >> A9 >> >> Your help is highly appreciated. >> Thanks >> > > -- > Sarah Goslee > http://www.functionaldiversity.org > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.David Winsemius Alameda, CA, USA