首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将前面的0替换为紧跟在dataframe列后面的数字。

问将前面的0替换为紧跟在dataframe列后面的数字。
EN

Stack Overflow用户
提问于 2022-06-01 16:39:45
回答 4查看 59关注 0票数 2

我有这样一个列的dataframe:

​

​

他是dataframe的一个例子(真实的一个有多个列,但是,为此,我将只发布重要的一栏):

代码语言:javascript
复制
structure(list(frame = c(0L, 0L, 0L, 0L, 473047L, 0L, 473049L,0L, 0L, 473051L, 0L, 0L, 473052L, 0L, 473055L)), row.names = c(NA, -15L), class = "data.frame")

帧列表示帧号。列中的0与后面的大数属于同一帧。因此,我想将前四个0改为473047,然后将下一个奇异值0改为473049,然后将接下来的两个0改为473051,依此类推。

有没有人有关于如何在基R或使用tidyverse中这样做的提示?我想也许for循环/if语句组合可以通过某种索引过程来工作。

代码语言:javascript
复制
for the length of the frame column
if frame > 0
count back up the column and replace the preceding 0s with that number

然而,除了这个伪代码之外,我想不出一个可能的解决方案。任何帮助都将不胜感激!

EN

回答 4

Stack Overflow用户

发布于 2022-06-01 17:05:07

您可以尝试这样做,首先用NAs替换零。

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

dat %>%
  mutate(frame = ifelse(frame == 0, NA, frame)) %>%
  fill(frame, .direction = "up")
    frame
1  473047
2  473047
3  473047
4  473047
5  473047
6  473049
7  473049
8  473051
9  473051
10 473051
11 473052
12 473052
13 473052
14 473055
15 473055
票数 3
EN

Stack Overflow用户

发布于 2022-06-01 17:01:21

首先用NA替换零。之后,您可以使用来自zoo的zoo

代码语言:javascript
复制
library(dplyr)
library(zoo)
df %>%
  na_if(0) %>%
  na.locf(., fromLast = TRUE)

输出:

代码语言:javascript
复制
    frame
1  473047
2  473047
3  473047
4  473047
5  473047
6  473049
7  473049
8  473051
9  473051
10 473051
11 473052
12 473052
13 473052
14 473055
15 473055
票数 2
EN

Stack Overflow用户

发布于 2022-06-01 17:19:42

我们可以像Quinten那样使用na.locf。但这里的R基是:

代码语言:javascript
复制
library(zoo)
df$frame<-na.locf(with(df,ifelse(frame==0,NA_real_,frame)),fromLast=TRUE)

    frame
1  473047
2  473047
3  473047
4  473047
5  473047
6  473049
7  473049
8  473051
9  473051
10 473051
11 473052
12 473052
13 473052
14 473055
15 473055
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72465363

复制
相关文章

相似问题

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