[R] problem with function that adds rows to dataframe based on conditional statement

Curtis Burkhalter curtisburkhalter at gmail.com
Thu Mar 5 21:41:38 CET 2015


Hello everyone,

I'm having a problem with a function that I wrote that is supposed to add a
row to dataframe based upon a conditional statement. To explain I've used
an example below:

#create data frame
animals=c("bird","dog","cat")
animals=rep(animals,each=4)
animals=animals[1:11]
animalYears=c(1,1,2,2,1,1,2,2,1,1,2)
animalMass=round(runif(11,min=10,max=50),0)

comAn=as.data.frame(cbind(animals,animalYears,animalMass))
comAn

  * animals* *animalYears* *animalMass*
1     bird           1         30
2     bird           1         32
3     bird           2         27
4     bird           2         16
5      dog           1         22
6      dog           1         25
7      dog           2         41
8      dog           2         22
9      cat           1         30
10     cat           1         37
11     cat           2         49

We can see here that for every type of animal I have two years of mass
measurements, except for the cat in year 2. What I want to do is add an
additional row to the end of the dataframe that consists strictly of NAs
and then I can substitute those out later.

So what I first did was split the 'comAn' dataframe into the different
Animal by Year combos.

#This line splits 'com_An' into a list ordered by the Animal by Year combos
comAn_split=split(comAn, paste(comAn$animals,comAn$animalYear))

Then I wrote the function that identifies whether a particular Animal by
Year combo is less than two rows in length and if so it should add another
row that consists only of NAs using the vector 'NAs':

#This function identifies the length of each Animal by Year combo and then
#uses the rbind function built in R to add a row
#to each animal by year combo if they have less than 2 samples

addNA <- function(comAn) {
  NAs=c(NA,NA,NA)
        ind <- seq_len(nrow(comAn))
        comAn[ifelse(length(ind)<2,rbind(NAs),length(ind)),]
}

#This applies the function addNs to the animals data organized in list
format
addedNAcomAn <- do.call(rbind, lapply(comAn_split, addNA))
addedNAcomAn

When I apply the function to the list of the different Animal by Year
combos this is what I get:
       animals animalYears animalMass
bird 1    bird           1         23
bird 2    bird           2         50
cat 1      cat           1         15
cat 2     <NA>        <NA>       <NA>
dog 1      dog           1         23
dog 2      dog           2         38

What I expect is this:

   animals animalYears animalMass
1     bird           1         41
2     bird           1         23
3     bird           2         23
4     bird           2         50
5      dog           1         49
6      dog           1         23
7      dog           2         13
8      dog           2         38
9      cat           1         42
10     cat           1         15
11     cat           2         33
12     NA           NA      NA

Am I conditioning improperly within the function or am I missing something
else. Any help would be greatly appreciated.

Best

-- 
Curtis Burkhalter

	[[alternative HTML version deleted]]



More information about the R-help mailing list