我有一個類似于這個最小示例的表,沒有差異列:
| 扳機 | 價值觀 | 區別 |
|---|---|---|
| 0 | 3 | |
| 0 | 不適用 | |
| 0 | 不適用 | |
| 1 | 5 | 2 |
| 0 | 4 | |
| 0 | 不適用 | |
| 1 | 10 | 6 |
我想從每個觸發點(觸發器 = 1)的數字中減去上述數字(并省略 NA)
有沒有辦法在R中做到這一點?
uj5u.com熱心網友回復:
cumsum在“觸發器”上創建一個分組列并取lag,然后將第一個和最后一個元素之間的差異replace作為last每組的值
library(dplyr)
df1 %>%
group_by(grp = lag(cumsum(trigger), default = 0)) %>%
mutate(difference = replace(rep(NA, n()), n(),
values[n()] - values[1])) %>%
ungroup %>%
select(-grp)
-輸出
# A tibble: 7 × 3
trigger values difference
<int> <int> <int>
1 0 3 NA
2 0 NA NA
3 0 NA NA
4 1 5 2
5 0 4 NA
6 0 NA NA
7 1 10 6
資料
df1 <- structure(list(trigger = c(0L, 0L, 0L, 1L, 0L, 0L, 1L), values = c(3L,
NA, NA, 5L, 4L, NA, 10L)), class = "data.frame", row.names = c(NA,
-7L))
uj5u.com熱心網友回復:
# Import data: df => data.frame
df <- structure(list(trigger = c(0L, 0L, 0L, 1L, 0L, 0L, 1L), values = c(3L,
NA, NA, 5L, 4L, NA, 10L), diff_col = c(NA, NA, NA, 2L, -1L, NA,
6L)), row.names = c(NA, -7L), class = "data.frame")
# Create an empty vector: diff_col => integer vector
df$diff_col <- NA_integer_
# Difference the X.values vector, ignoring NAs:
# diff_col => integer vector
df[which(!(is.na(df$values)))[-1], "diff_col"] <- diff(
na.omit(
df$values
)
)
# Nullify the value if the trigger is 0:
# diff_col => integer vector
df$diff_col <- with(
df,
ifelse(
trigger == 0,
NA_integer_,
diff_col
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315266.html
下一篇:在R中編輯tmap資料檔案
