[R] conditional Dataframe filling
arun
smartpink111 at yahoo.com
Wed Mar 27 22:09:25 CET 2013
Hi Camilo,
No problem.
In case, you wanted to process the partial NA rows, this could help:
datNew<- structure(list(a = c(TRUE, NA, FALSE, TRUE, TRUE), b = c(TRUE,
NA, FALSE, TRUE, TRUE), c = c(TRUE, NA, FALSE, TRUE, FALSE),
d = c(TRUE, NA, FALSE, TRUE, FALSE), e = c(TRUE, NA, FALSE,
FALSE, NA), f = c(FALSE, NA, TRUE, TRUE, NA), g = c(FALSE,
NA, TRUE, TRUE, TRUE), h = c(FALSE, NA, FALSE, TRUE, FALSE
), i = c(FALSE, NA, FALSE, FALSE, NA), j = c(TRUE, NA, TRUE,
TRUE, TRUE), k = c(TRUE, NA, TRUE, TRUE, FALSE), l = c(TRUE,
NA, TRUE, TRUE, FALSE), m = c(TRUE, NA, FALSE, FALSE, TRUE
)), .Names = c("a", "b", "c", "d", "e", "f", "g", "h", "i",
"j", "k", "l", "m"), row.names = c("w", "x", "y", "z", "u"), class = "data.frame")
dat2New<- datNew
dat2New[rowSums(is.na(dat2New))==0 | rowSums(is.na(dat2New))!=ncol(dat2New),]<- t(apply(!datNew[rowSums(is.na(datNew))==0 | rowSums(is.na(datNew))!=ncol(datNew),],1,function(x) {x[!is.na(x)]<- unlist(lapply(split(x[!is.na(x)],cumsum(c(0,abs(diff(x[!is.na(x)]))))),cumsum));x}))
dat2New
# a b c d e f g h i j k l m
#w 0 0 0 0 0 1 2 3 4 0 0 0 0
#x NA NA NA NA NA NA NA NA NA NA NA NA NA
#y 1 2 3 4 5 0 0 1 2 0 0 0 1
#z 0 0 0 0 1 0 0 0 1 0 0 0 1
#u 0 0 1 2 NA NA 0 1 NA 0 1 2 0
datNew
# a b c d e f g h i j k l m
#w TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
#x NA NA NA NA NA NA NA NA NA NA NA NA NA
#y FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE FALSE
#z TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE
#u TRUE TRUE FALSE FALSE NA NA TRUE FALSE NA TRUE FALSE FALSE TRUE
A.K.
----- Original Message -----
From: Camilo Mora <cmora at Dal.Ca>
To: arun <smartpink111 at yahoo.com>
Cc: R help <r-help at r-project.org>
Sent: Wednesday, March 27, 2013 4:49 PM
Subject: Re: [R] conditional Dataframe filling
Nice!.
Thanks,
Camilo
Camilo Mora, Ph.D.
Department of Geography, University of Hawaii
Currently available in Colombia
Phone: Country code: 57
Provider code: 313
Phone 776 2282
From the USA or Canada you have to dial 011 57 313 776 2282
http://www.soc.hawaii.edu/mora/
Quoting arun <smartpink111 at yahoo.com>:
> Dear Camilo,
>
> You can do this:
> dat1 <- structure(list(
> w = c(TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE),
> x = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
> y =
> c(FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE),
> z = c(TRUE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE)),
> row.names = c(NA, -13L),
> class = "data.frame")
>
> dat1<-t(dat1)
> colnames(dat1)<-c("a","b","c","d","e","f","g","h","i","j","k", "l","m")
> dat1<- as.data.frame(dat1)
> dat2<-dat1
> dat2[rowSums(is.na(dat2))==0,]<-
> t(apply(!dat1[rowSums(is.na(dat1))==0,],1,function(x)
> unlist(lapply(split(x,cumsum(c(0,abs(diff(x))))),cumsum))))
>
> dat2
> # a b c d e f g h i j k l m
> #w 0 0 0 0 0 1 2 3 4 0 0 0 0
> #x NA NA NA NA NA NA NA NA NA NA NA NA NA
> #y 1 2 3 4 5 0 0 1 2 0 0 0 1
> #z 0 0 0 0 1 0 0 0 1 0 0 0 1
>
>
> Suppose if NAs are there but not for the entire row (if I understand
> correctly), you wanted to have the whole row NA, right.
>
> datNew<- structure(list(a = c(TRUE, NA, FALSE, TRUE, TRUE), b = c(TRUE,
> NA, FALSE, TRUE, TRUE), c = c(TRUE, NA, FALSE, TRUE, FALSE),
> d = c(TRUE, NA, FALSE, TRUE, FALSE), e = c(TRUE, NA, FALSE,
> FALSE, NA), f = c(FALSE, NA, TRUE, TRUE, NA), g = c(FALSE,
> NA, TRUE, TRUE, TRUE), h = c(FALSE, NA, FALSE, TRUE, FALSE
> ), i = c(FALSE, NA, FALSE, FALSE, NA), j = c(TRUE, NA, TRUE,
> TRUE, TRUE), k = c(TRUE, NA, TRUE, TRUE, FALSE), l = c(TRUE,
> NA, TRUE, TRUE, FALSE), m = c(TRUE, NA, FALSE, FALSE, TRUE
> )), .Names = c("a", "b", "c", "d", "e", "f", "g", "h", "i",
> "j", "k", "l", "m"), row.names = c("w", "x", "y", "z", "u"), class =
> "data.frame")
>
> datNew
> # a b c d e f g h i j
> k l m
> #w TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE
> TRUE TRUE
> #x NA NA NA NA NA NA NA NA NA NA
> NA NA NA
> #y FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE
> TRUE FALSE
> #z TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE
> TRUE FALSE
> #u TRUE TRUE FALSE FALSE NA NA TRUE FALSE NA TRUE FALSE
> FALSE TRUE
>
> dat2New<- datNew
> dat2New[rowSums(is.na(dat2New))==0,]<-t(apply(!datNew[rowSums(is.na(datNew))==0,],1,function(x)
> unlist(lapply(split(x,cumsum(c(0,abs(diff(x))))),cumsum))))
> dat2New[rowSums(is.na(dat2New))!=0 &
> rowSums(is.na(dat2New))!=ncol(dat2New),]<-NA
> dat2New
> # a b c d e f g h i j k l m
> #w 0 0 0 0 0 1 2 3 4 0 0 0 0
> #x NA NA NA NA NA NA NA NA NA NA NA NA NA
> #y 1 2 3 4 5 0 0 1 2 0 0 0 1
> #z 0 0 0 0 1 0 0 0 1 0 0 0 1
> #u NA NA NA NA NA NA NA NA NA NA NA NA NA
> A.K.
>
>
>
>
>
>
> ----- Original Message -----
> From: Camilo Mora <cmora at dal.ca>
> To: arun <smartpink111 at yahoo.com>
> Cc: R help <r-help at r-project.org>
> Sent: Wednesday, March 27, 2013 4:10 PM
> Subject: Re: [R] conditional Dataframe filling
>
> Thanks Arun,
>
> Well that is interesting. My intention was to have a dataframe with
> the same number of rows in the original data, and for the rows with
> NAs, then return NA (If there are NAs, often the entire row has NAs).
> What is interesting is that in your code with NAs, the row that has
> NAs gets NAs in the output, which is what I am looking for.
>
> I guess a solution is to subset complete rows and then run your line
> of code. Unless there is an alternative, to tell cumsum to leave NAs
> as NAs?
>
> Thanks again,
>
> Camilo
>
>
> Camilo Mora, Ph.D.
> Department of Geography, University of Hawaii
> Currently available in Colombia
> Phone: Country code: 57
> Provider code: 313
> Phone 776 2282
> From the USA or Canada you have to dial 011 57 313 776 2282
> http://www.soc.hawaii.edu/mora/
>
>
>
> Quoting arun <smartpink111 at yahoo.com>:
>
>> Dear Camilo,
>>
>> How do you want to deal with the NAs?
>>
>> If I remove the NAs:
>> dat1 <- structure(list(
>> w = c(TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE),
>> x = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
>> y =
>> c(FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE),
>> z = c(TRUE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE)),
>> row.names = c(NA, -13L),
>> class = "data.frame")
>>
>> dat1<-t(dat1)
>> colnames(dat1)<-c("a","b","c","d","e","f","g","h","i","j","k", "l","m")
>> dat1<- as.data.frame(na.omit(dat1))
>> dat2<-dat1
>> dat2[]<-t(apply(!dat1,1,function(x)
>> unlist(lapply(split(x,cumsum(c(0,abs(diff(x))))),cumsum))))
>> dat2
>> # a b c d e f g h i j k l m
>> #w 0 0 0 0 0 1 2 3 4 0 0 0 0
>> #y 1 2 3 4 5 0 0 1 2 0 0 0 1
>> #z 0 0 0 0 1 0 0 0 1 0 0 0 1
>>
>>
>> dat1
>> # a b c d e f g h i j
>> k l m
>> #w TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE
>> TRUE TRUE
>> #y FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE
>> TRUE FALSE
>> #z TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE
>> TRUE FALSE
>>
>>
>> A.K.
>>
>>
>>
>>
>>
>> ----- Original Message -----
>> From: Camilo Mora <cmora at dal.ca>
>> To: arun <smartpink111 at yahoo.com>
>> Cc: R help <r-help at r-project.org>
>> Sent: Wednesday, March 27, 2013 3:27 PM
>> Subject: Re: [R] conditional Dataframe filling
>>
>> Dear Arun,
>>
>> Thank you very much for your help with this.I did not know where to
>> start looking to solve that problem, so I truly appreciate your input.
>>
>> The line of code you sent seems to work but it duplicates the
>> results. Do you know why that may happen?
>> Below is a larger database, to which I apply your line of code.
>>
>> Thank you very much again,
>> Camilo
>>
>>
>> dat1 <- structure(list(
>> w = c(TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE),
>> x = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
>> y =
>> c(FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE),
>> z = c(TRUE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE)),
>> row.names = c(NA, -13L),
>> class = "data.frame")
>>
>> dat1<-t(dat1)
>> colnames(dat1)<-c("a","b","c","d","e","f","g","h","i","j","k", "l","m")
>>
>> dat2<-dat1
>>
>> dat2[]<-t(apply(!dat1,1,function(x)
>> unlist(lapply(split(x,cumsum(c(0,abs(diff(x))))),cumsum))))
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> Camilo Mora, Ph.D.
>> Department of Geography, University of Hawaii
>> Currently available in Colombia
>> Phone: Country code: 57
>> Provider code: 313
>> Phone 776 2282
>> From the USA or Canada you have to dial 011 57 313 776 2282
>> http://www.soc.hawaii.edu/mora/
>>
>>
>>
>> Quoting arun <smartpink111 at yahoo.com>:
>>
>>> HI,
>>>
>>> Just a correction:
>>>
>>> :
>>>
>>> dat2[]<-t(apply(!dat1,1,function(x)
>>> unlist(lapply(split(x,cumsum(c(0,abs(diff(x))))),cumsum))))
>>> #should also work
>>> A.K.
>>>
>>>
>>>
>>> ----- Original Message -----
>>> From: arun <smartpink111 at yahoo.com>
>>> To: Camilo Mora <cmora at dal.ca>
>>> Cc: R help <r-help at r-project.org>
>>> Sent: Wednesday, March 27, 2013 9:09 AM
>>> Subject: Re: [R] conditional Dataframe filling
>>>
>>>
>>>
>>> Hi,
>>> You could try:
>>> dat1<- read.table(text="
>>> a b c d
>>> TRUE TRUE TRUE TRUE
>>> FALSE FALSE FALSE TRUE
>>> FALSE TRUE FALSE FALSE
>>> ",sep="",header=TRUE)
>>> dat2<-dat1
>>> dat2[]<-t(apply(1*!dat1,1,function(x)
>>> unlist(lapply(split(x,cumsum(c(0,abs(diff(x))))),cumsum))))
>>> dat2
>>> # a b c d
>>> #1 0 0 0 0
>>> #2 1 2 3 0
>>> #3 1 0 1 2
>>> A.K.
>>>
>>>
>>> ----- Original Message -----
>>> From: Camilo Mora <cmora at dal.ca>
>>> To: r-help at r-project.org
>>> Cc:
>>> Sent: Wednesday, March 27, 2013 4:31 AM
>>> Subject: [R] conditional Dataframe filling
>>>
>>> Hi everyone:
>>>
>>> This may be trivial but I just have not been able to figure it out.
>>>
>>> Imagine the following dataframe:
>>> a b c d
>>> TRUE TRUE TRUE TRUE
>>> FALSE FALSE FALSE TRUE
>>> FALSE TRUE FALSE FALSE
>>>
>>> I would like to create a new dataframe, in which TRUE gets 0 but if
>>> false then add 1 to the cell to the left. So the results for the
>>> example above should be something like:
>>>
>>> a b c d
>>> 0 0 0 0
>>> 1 2 3 0
>>> 1 0 1 2
>>>
>>> I wonder if you may know?.
>>>
>>> Thanks,
>>>
>>> Camilo
>>>
>>>
>>>
>>>
>>> Camilo Mora, Ph.D.
>>> Department of Geography, University of Hawaii
>>> Currently available in Colombia
>>> Phone: Country code: 57
>>> Provider code: 313
>>> Phone 776 2282
>>> From the USA or Canada you have to dial 011 57 313 776 2282
>>> http://www.soc.hawaii.edu/mora/
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> 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.
>>>
>>>
>>
>>
>
>
More information about the R-help
mailing list