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。
一种选择是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)