R:如何在同一观察单位内向前传送最后一个观察值

问题描述 投票:0回答:2

我对R和tidyverse有一点问题,但不幸的是我似乎无法解决。

说我们有三个商店的季度观察结果(在最小的工作示例中,值实际上并不重要,重要的是NA和最后一列中的少量邮政编码)。

library(tidyverse)



mydf <- tribble(~shop, ~quarter, ~revenue, ~postcode,  "Shop A",1, 100, NA, "Shop A",2, 210, NA,"Shop A",3, 50 , NA,  "Shop A",4, 100, 1000,  "Shop B", 1, 40, NA,  "Shop B", 2, 80, NA,   "Shop B", 3, 20, NA,   "Shop B", 4, 40, NA,  "Shop C", 1, 20, 2011,  "Shop C", 2, 20, NA,  "Shop C", 3, 30, NA,  "Shop C", 4, 25, NA,)

商店A在第四季度中只有一个邮政编码。商店B没有任何邮政编码,商店C在第一季度只有一个邮政编码,请参阅mydf。

我们可以放心地假设商店的邮政编码不变,因此我们可以结转最后观察到的值,即邮政编码。

我为此使用tidyverse,命令如下。

mydf %>% fill(postcode, .direction="down")
mydf %>% fill(postcode, .direction="up")

[不幸的是,R似乎并不太在乎观察单位,它只是选择发现的邮政编码并将这个值向前传送,在这个示例中[[跨不同的商店。

我最后要填写的是商店A和C的邮政编码,而不是商店B的邮政编码,我必须手动为其查找邮政编码。

((在我使用的数据集中,有成千上万的观影(“商店”),所以这是减少工作量的好方法。)

我对R很陌生,所以请不要对我苛刻。

感谢您提供任何解决方案提示。

David

r na
2个回答
1
投票
使用group_by,然后填充应该起作用。它只会为每个商店填写相同的邮政编码。您的样本数据存在的问题是,商店B在任何观察结果中都没有邮政编码。

使用.direction ='downup'应该填写邮政编码,无论它在邮政编码列中的什么位置。如果它始终是第一次观察,则不需要它。

library(tidyverse) mydf <- tribble(~shop, ~quarter, ~revenue, ~postcode, "Shop A",1, 100, NA, "Shop A",2, 210, NA,"Shop A",3, 50 , NA, "Shop A",4, 100, 1000, "Shop B", 1, 40, NA, "Shop B", 2, 80, NA, "Shop B", 3, 20, NA, "Shop B", 4, 40, NA, "Shop C", 1, 20, 2011, "Shop C", 2, 20, NA, "Shop C", 3, 30, NA, "Shop C", 4, 25, NA,) mydf %>% group_by(shop) %>% fill(postcode, .direction = 'downup') #> # A tibble: 12 x 4 #> # Groups: shop [3] #> shop quarter revenue postcode #> <chr> <dbl> <dbl> <dbl> #> 1 Shop A 1 100 1000 #> 2 Shop A 2 210 1000 #> 3 Shop A 3 50 1000 #> 4 Shop A 4 100 1000 #> 5 Shop B 1 40 NA #> 6 Shop B 2 80 NA #> 7 Shop B 3 20 NA #> 8 Shop B 4 40 NA #> 9 Shop C 1 20 2011 #> 10 Shop C 2 20 2011 #> 11 Shop C 3 30 2011 #> 12 Shop C 4 25 2011

reprex package(v0.3.0)在2020-01-10创建


0
投票
基本的R解决方案:

library(tibble) mydf <- tribble(~shop, ~quarter, ~revenue, ~postcode, "Shop A",1, 100, NA, "Shop A",2, 210, NA,"Shop A",3, 50 , NA, "Shop A",4, 100, 1000, "Shop B", 1, 40, NA, "Shop B", 2, 80, NA, "Shop B", 3, 20, NA, "Shop B", 4, 40, NA, "Shop C", 1, 20, 2011, "Shop C", 2, 20, NA, "Shop C", 3, 30, NA, "Shop C", 4, 25, NA,) list_df <- split(mydf, mydf$shop) semi_filled <- lapply(list_df, function(x) { unq <- unique(x$postcode) x$postcode <- if (all(is.na(unq))) NA else unq[!is.na(unq)] x }) Reduce(rbind, semi_filled) #> # A tibble: 12 x 4 #> shop quarter revenue postcode #> <chr> <dbl> <dbl> <dbl> #> 1 Shop A 1 100 1000 #> 2 Shop A 2 210 1000 #> 3 Shop A 3 50 1000 #> 4 Shop A 4 100 1000 #> 5 Shop B 1 40 NA #> 6 Shop B 2 80 NA #> 7 Shop B 3 20 NA #> 8 Shop B 4 40 NA #> 9 Shop C 1 20 2011 #> 10 Shop C 2 20 2011 #> 11 Shop C 3 30 2011 #> 12 Shop C 4 25 2011

© www.soinside.com 2019 - 2024. All rights reserved.