R:重复值,直到新值按组出现为止,只有第一个非NA值出现一次

Jar*_*ale 3 grouping text r function repeat

我希望重复输入值,直到按组显示新值。我有一阵子的功能是在网上找到的,几乎可以满足我的需求,但不完全是。这是该函数:

    repeat.before <- function(x) {
  ind <- which(!is.na(x))
  ind_rep <- ind
  if (is.na(x[1])) {
    ind_rep <- c(min(ind), ind)
    ind <- c(1, ind)
  }
  rep(x[ind_rep], times = diff(c(ind, length(x) + 1)))
}
Run Code Online (Sandbox Code Playgroud)

此功能将按组成功重复该值,直到出现新值。问题是,如果该列以NA开头,则在第一个值之前存在的以下行将最终采用该第一个值,而不是剩余的NA。我将通过以下示例说明我的意思:

    group    location 
    A        NA
    A        NA
    A        New York
    A        NA
    A        NA
    B        Chicago
    B        NA
    B        Philly
    B        NA
Run Code Online (Sandbox Code Playgroud)

上面的代码将输出以下内容:

    group    location 
    A        New York
    A        New York
    A        New York
    A        New York
    A        New York
    B        Chicago
    B        Chicago
    B        Philly
    B        Philly
Run Code Online (Sandbox Code Playgroud)

同样,它与我要寻找的非常接近,但不完全相同。这是我正在寻找的输出:

    group    location 
    A        NA
    A        NA
    A        New York
    A        New York
    A        New York
    B        Chicago
    B        Chicago
    B        Philly
    B        Philly
Run Code Online (Sandbox Code Playgroud)

基本上,我不希望“重复”代码在找到第一个值之前就开始工作。在此之前,我希望各行保持不适用。目的是使行不会被错误分类,即在上面的示例中,前两个A行不应标记为New York。

akr*_*run 5

一种选择是fill按“分组”分组之后。使用fill.direction指定为“向上”或“向下”(默认选项)。在这里,我们仅需要基于预期输出的“ down”选项

library(dplyr)
library(tidyr)
df1 %>%
  group_by(group) %>%
  fill(location) 
# A tibble: 9 x 2
# Groups:   group [2]
#  group location
#  <chr> <chr>   
#1 A     <NA>
#2 A     <NA>
#3 A     New York
#4 A     New York
#5 A     New York
#6 B     Chicago 
#7 B     Chicago 
#8 B     Philly  
#9 B     Philly  
Run Code Online (Sandbox Code Playgroud)

数据

df1 <- structure(list(group = c("A", "A", "A", "A", "A", "B", "B", "B", 
 "B"), location = c(NA, NA, "New York", NA, NA, "Chicago", NA, 
 "Philly", NA)), class = "data.frame", row.names = c(NA, -9L))
Run Code Online (Sandbox Code Playgroud)

  • @Jared不希望前两行填充“纽约”。我会填满这行。 (2认同)