0

日が経つにつれて行が脱落し続けるデータセットがあり、これらの行を再度追加したいとしましょう。

行が欠落している例:

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)

そして、「リンゴ」と「オレンジ」がそのままドロップアウトする木曜日と金曜日に新しい行を埋めたいと思います。

「バナナ」は水曜日に初めて登場するため、少し複雑なことに注意してください。

完成したテーブルは次のようになります。

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)

2 つのテーブルの比較

dfmissing
dfcomplete

データが 1 週間しかないため、「月曜日」が繰り返されることはないと仮定します。列「日」は、固有の要素のリストです。

前もって感謝します。

4

1 に答える 1

1

ここで、ループ試行のクイックスローを示します。あなたが説明したことで、私は 2 つの if ステートメントを使用しました。あまり効率的ではありませんが、仕事は完了します。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)
        }
    }
}
于 2012-07-05T07:12:16.087 に答える