我有一個這樣的列的資料框:
他是資料框的一個示例(真實的有多個列,但是為此我將只發布重要的列):
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 陳述句組合可以通過某種索引程序來作業,即
for the length of the frame column
if frame > 0
count back up the column and replace the preceding 0s with that number
但是,除了這個偽代碼之外,我想不出可能的解決方案。非常感激任何的幫助!
uj5u.com熱心網友回復:
首先用 替換零NA
。之后,您可以使用na.locf
from zoo
:
library(dplyr)
library(zoo)
df %>%
na_if(0) %>%
na.locf(., 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
uj5u.com熱心網友回復:
你可以試試這個,首先用 NA 替換零
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
uj5u.com熱心網友回復:
我們可以na.locf
像@Quinten 那樣使用。但這里以 R 為基數:
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
uj5u.com熱心網友回復:
df %>% fill(frame, .direction="up")
uj5u.com熱心網友回復:
檢查它是否有效#this is using base R
data <-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")
index = 1
for(i in 1:length(data$frame)){
if(data$frame[i] > 0){
data$frame[index:i] <- data$frame[i]
index = i
}
}
print(data$frame)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/485487.html
上一篇:jq如果值包含則追加
下一篇:縮短if陳述句