0

Lets say I have a dataset where rows keep falling out as I go through the days, and I want to add these rows in again.

Example with missing rows:

Fruits <- c(rep(c("apples","oranges","pears","kiwis"),3),
    "bananas","oranges","pears","kiwis","bananas","pears","kiwis","bananas")
Days <- c(rep("Monday",4),rep("Tuesday",4),rep("Wednesday",5),
    rep("Thursday",4),rep("Friday",3))
Amounts <- c(10,15,20,20,10,15,20,20,10,15,20,20,25,15,20,20,25,20,20,25)
dfmissing <- data.frame(Fruits,Days,Amounts)

And I want it to fill new rows on Thursday and Friday when "apples" and "oranges" drop out as such.

Note that "bananas" appears for the first time on Wednesday, which complicates matters a little.

The completed table should look like the following

Fruits <- c(rep(c("apples","oranges","pears","kiwis"),2), 
    rep(c("apples","oranges","pears","kiwis","bananas"),3))
Days <- c(rep("Monday",4),rep("Tuesday",4),
    rep("Wednesday",5),rep("Thursday",5),rep("Friday",5))
Amounts <- c(rep(c("10","15","20","20"),2),rep(c("10","15","20","20","25"),3))
dfcomplete <- data.frame(Fruits,Days,Amounts)

Comparing the two tables

dfmissing
dfcomplete

Assume there is only one week of data so "Monday" never gets repeated etc - the column "Days" is a list of unique factors.

Thanks in advance.

lilster
  • 921
  • 5
  • 14

1 Answers1

1

Here id my quick slow for loop attempt. With what you described, I have used two if statements , one to check if there is new fruit to add, and one to check if there are any missing fruits. It isn't very efficient, but it will get the job done. I will let you sort out the data.frame.

# Get what days are in the data frame
days <- unique(dfmissing$Days)
# Start with the first day to get the fruits.
fruit <- dfmissing[dfmissing$Days==days[1],"Fruits"]
# Create a loop to loop over the actual days
for(i in 2:length(days)){
    # Determine which fruits are present on this day.
    newdayfruit <- dfmissing[dfmissing$Days==days[i],"Fruits"]

    newFruitToAdd <- newdayfruit[is.na(match(newdayfruit,fruit))]
    # Check if there are any new fruits to add. 
    if(length(newFruitToAdd)>0){
        # Add the new fruit to the fruits.
        fruit <- c(as.character(fruit), as.character(newFruitToAdd))
    }
    # Check if there are any missing fruits.
    missingFruit <- fruit[is.na(match(fruit, dfmissing[dfmissing$Days==days[i],"Fruits"]))]
    # If there are missing fruits then the should be added to the dataframe
    if(length(missingFruit)>0){
        # Loop over each missing fruit.
        for(j in 1:length(missingFruit)){
            # Get the value of the missing fruit from the previous day
            updateWith <- dfmissing[dfmissing$Days==days[i-1]&dfmissing$Fruits==missingFruit[j],]
            # Change the day to the current day
            updateWith$Days <- days[i]
            # Add a row to the data frame with the updated value.
            dfmissing <- rbind(dfmissing, updateWith)
        }
    }
}
Jase_
  • 1,186
  • 9
  • 12