我正在計算前一個“結束”數字與下一個“開始”數字之間的差距。參考附上的資料,作為例子,結果在df$gap中。在第一行,數字是 df$gap=df$start[1]-1。其余的結果將是 df$start[n]-df$end[n-1]。我可以在 Excel 中輕松地做到這一點,但是,我很難弄清楚如何在沒有回圈的情況下在 R 中做到這一點。
如果有人能提供解決方案,那將不勝感激!
df = read.table(text="start end
172 635
766 1699
1817 1891
2015 2320", header=T)
預期結果:
start end gap
172 635 171
766 1699 131
1817 1891 118
2015 2320 124
uj5u.com熱心網友回復:
使用dplyr這是使用的解決方案lag
df %>% mutate(gap = start - lag(end))%>%
mutate(gap = ifelse(row_number() == 1,start -1,gap))
輸出:
start end gap
1 172 635 171
2 766 1699 131
3 1817 1891 118
4 2015 2320 124
uj5u.com熱心網友回復:
在基礎 R 中:
df$gap <- df$start - c(1L, head(df$end, -1))
給出:
df
start end gap
1 172 635 171
2 766 1699 131
3 1817 1891 118
4 2015 2320 124
uj5u.com熱心網友回復:
dplyr 加上一個小技巧可以幫助解決這個問題:
library(dplyr)
df = read.table(text="start end
172 635
766 1699
1817 1891
2015 2320", header=T)
df$temp <- c(1, df$end[-length(df$end)])
mutate(df, gap = start - temp) |> select(-temp)
輸出:
start end gap
1 172 635 171
2 766 1699 131
3 1817 1891 118
4 2015 2320 124
uj5u.com熱心網友回復:
包裝的一種可能解決方案 data.table
請在下面找到reprex。
REPREX
library(data.table)
DT <- setDT(df)
DT[, end_lead := shift(end,1)][, `:=` (gap = start - end_lead, end_lead = NULL)]
setnafill(DT, fill = DT$start[1] - 1)
DT
#> start end gap
#> 1: 172 635 171
#> 2: 766 1699 131
#> 3: 1817 1891 118
#> 4: 2015 2320 124
由reprex 包(v0.3.0)于 2021 年 10 月 13 日創建
uj5u.com熱心網友回復:
如果我得到你的問題,一個解決方案可能是lag函式dplyr
例如:
df[,'gap'] = df[,'start'] - lag(df[,"end"], n = 1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/312496.html
標籤:r
