让我们说我有一个数据集,当我经历这些日子时行会不断出现,我想再次添加这些行。
缺少行的示例:
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
假设只有一周的数据,所以“星期一”永远不会重复等等 - “天”列是一个独特因素列表。
提前致谢。
答案 0 :(得分: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)
}
}
}