首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在多个值的开始和结束之间填入值

在多个值的开始和结束之间填入值
EN

Stack Overflow用户
提问于 2022-11-09 19:57:22
回答 3查看 57关注 0票数 2

我有一个类似于这篇文章的问题:Fill in values between start and end value in R

不同之处在于,我需要在多个值的开始和结束之间填写值,并且它不包含和ID列:

我的数据看起来如下(原始数据有许多不同的值):

我的最终结果应该如下所示:

数据:

代码语言:javascript
复制
structure(list(elevation = c(150L,140L, 130L, 120L, 110L, 120L, 130L, 140L, 150L, 90L, 80L, 70L,66L, 60L, 50L, 66L, 70L, 72L, 68L, 65L, 60L, 68L, 70L),code = c(NA, NA, "W", NA, NA, NA, "W", NA, NA, NA, NA, NA, "X", NA, NA, "X", NA, NA, "Y", NA, NA, "Y", NA)), class = "data.frame", row.names = c(NA,-23L))

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-09 20:20:21

代码语言:javascript
复制
df %>% 
   mutate(code = runner::fill_run(code, only_within = T))

   elevation code
1        150 <NA>
2        140 <NA>
3        130    W
4        120    W
5        110    W
6        120    W
7        130    W
8        140 <NA>
9        150 <NA>
10        90 <NA>
11        80 <NA>
12        70 <NA>
13        66    X
14        60    X
15        50    X
16        66    X
17        70 <NA>
18        72 <NA>
19        68    Y
20        65    Y
21        60    Y
22        68    Y
23        70 <NA>
票数 5
EN

Stack Overflow用户

发布于 2022-11-09 20:13:47

这可能不是很漂亮,但它有效:

代码语言:javascript
复制
codepos <- which(!is.na(dd$code))
stopifnot(length(codepos)%%2==0)
for (group in split(codepos, (seq_along(codepos)+1)%/%2)) {
  stopifnot(dd$code[group[1]] == dd$code[group[2]])
  dd$code[group[1]:group[2]] <- dd$code[group[1]]
}

我们从找到所有的非NA代码开始。我们假设它们总是成对的值,然后只填写每对的范围。

票数 3
EN

Stack Overflow用户

发布于 2022-11-09 20:22:47

下面是一种tidyverse方法。它通过为通过交替的NA和字符给出的模式赋值来生成临时分组。

代码语言:javascript
复制
library(dplyr)
library(tidyr)

df %>% 
  mutate(n = n(), l_c = lag(code)) %>% 
  group_by(grp = cumsum(lag(!is.na(code), default = F) == is.na(code)), 
           grp_in = grp %in% seq(2, unique(n), 4)) %>% 
  fill(l_c) %>%
  ungroup() %>% 
  mutate(code = ifelse(grp_in, l_c, code)) %>% 
  select(elevation, code) %>%
  print(n = Inf)
# A tibble: 23 × 2
   elevation code
       <int> <chr>
 1       150 NA
 2       140 NA
 3       130 W
 4       120 W
 5       110 W
 6       120 W
 7       130 W
 8       140 NA
 9       150 NA
10        90 NA
11        80 NA
12        70 NA
13        66 X
14        60 X
15        50 X
16        66 X
17        70 NA
18        72 NA
19        68 Y
20        65 Y
21        60 Y
22        68 Y
23        70 NA
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74380693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档