Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R使用前一行值和条件填写NA_R_Na - Fatal编程技术网

R使用前一行值和条件填写NA

R使用前一行值和条件填写NA,r,na,R,Na,我需要用前一行值填充NA行,但仅在不更改条件之前。 作为一周中几天、膳食和价格的简单示例: Day = c("Mon", "Tues", "Wed", "Thus", "Fri", "Sat","Sun","Mon", "Tues", "Wed", "Thus", "Fri", "Sat","Sun") Meal = c("B","B","B","B","B","D","D","D","D","L","L", "L","L","L") Price = c(NA, 20, NA

我需要用前一行值填充NA行,但仅在不更改条件之前。 作为一周中几天、膳食和价格的简单示例:

Day = c("Mon", "Tues", "Wed", "Thus", "Fri", "Sat","Sun","Mon", "Tues", 
       "Wed", "Thus", "Fri", "Sat","Sun") 
Meal = c("B","B","B","B","B","D","D","D","D","L","L", "L","L","L") 
Price = c(NA, 20, NA,NA,NA,NA,NA,15,NA,NA,10,10,NA,10) 
df = data.frame(Meal,Day ,Price )
df
   Meal  Day Price
1     B  Mon    NA
2     B Tues    20
3     B  Wed    NA
4     B Thus    NA
5     B  Fri    NA
6     D  Sat    NA
7     D  Sun    NA
8     D  Mon    15
9     D Tues    NA
10    L  Wed    NA
11    L Thus    10
12    L  Fri    10
13    L  Sat    NA
14    L  Sun    10
我需要在NA中填写上一份,但只填写一周内相同的膳食类型

我试过了

     na.locf(df, fromLast = TRUE)
   Meal  Day Price
1     B  Mon    20
2     B Tues    20
3     B  Wed    15
4     B Thus    15
5     B  Fri    15
6     D  Sat    15
7     D  Sun    15
8     D  Mon    15
9     D Tues    10
10    L  Wed    10
11    L Thus    10
12    L  Fri    10
13    L  Sat    10
14    L  Sun    10
这是错误的,因为与膳食类型重叠。 数据应如下所示:

  Meal  Day Price
1     B  Mon    20
2     B Tues    20
3     B  Wed    20
4     B Thus    20
5     B  Fri    20
6     D  Sat    15
7     D  Sun    15
8     D  Mon    15
9     D Tues    15
10    L  Wed    10
11    L Thus    10
12    L  Fri    10
13    L  Sat    10
14    L  Sun    10
非常感谢

您可以试试

library(zoo)
library(dplyr)
df %>% 
     group_by(Meal) %>% 
     mutate(Price= ifelse(any(!is.na(Price)), na.locf(na.locf(Price, 
                    fromLast=TRUE, na.rm=FALSE)), NA_real_))
#     Meal  Day Price
#1     B  Mon    20
#2     B Tues    20
#3     B  Wed    20
#4     B Thus    20
#5     B  Fri    20
#6     D  Sat    15
#7     D  Sun    15
#8     D  Mon    15
#9     D Tues    15
#10    L  Wed    10
#11    L Thus    10
#12    L  Fri    10
#13    L  Sat    10
#14    L  Sun    10

另一个选项使用
data.table

library(data.table)
library(xts)

dt <- data.table(df)

dt[, Price := na.locf(Price, fromLast = TRUE), by = Meal]
库(data.table)
图书馆(xts)

dt我使用此选项收到警告消息,尽管它有效。我尝试了此解决方案,也收到了警告,但结果看起来不错。@akrun&@ichester-是的,我也收到了警告,不知道为什么说实话…akrun-我从您以前的
data.table()
答案中也收到了类似的警告。@Chase Yes,它确实显示了我的数据。表解决方案也是如此,我的解决方案也不正确,因为每顿饭都有多个非NA值,虽然这个例子很简单,但我觉得每顿饭都会有不同的非NA值,此外,我仍然不确定数据集是否每顿饭有多周。我逐字尝试了这段代码,收到一条错误消息,上面说:
na.locf中的错误(Price,fromLast=TRUE):未使用的参数(fromLast=TRUE)
如果每顿饭的“Day”列都有重复项,即每顿饭有多周,该怎么办?条件是在“Mon”还是“Sun”上重置的?我在样本数据上测试了这个解决方案,效果很好。如果我在我的数据(700万行)上使用它,它会出现以下错误:错误:大小不兼容(0),预期为39712(组大小)或1个字符
df%>%groupby(餐)%%>%mutate(Price=ifelse(any(!is.na(Price))、na.locf(na.locf(Price,fromLast=TRUE,na.rm=FALSE))、na\u real\code>