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)

比较两张表

dfmissing
dfcomplete

假设只有一周的数据,因此“星期一”永远不会重复等 - “天”列是独特因素的列表。

提前致谢。

4

1 回答 1

1

这是我的快速慢速循环尝试。根据您的描述,我使用了两个 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 回答