我對 R 很陌生,所以也許這看起來很簡單,但我無法弄清楚。我的資料看起來像 Df,它需要看起來像 Df2:
Df <- data.frame(country = c("A", "A", "A", "A", "A", "B","B", "B", "B"),
year = c("1950", "1951", "1952", "1953", "1954", "1950", "1951", "1952", "1953"),
start_year = c("NA", "1951", "1951", "NA", "1954", "1950", "NA", "1951", "1951"),
end_year= c("NA", "NA", "1952", "NA", "1954", "1950", "NA", "NA", "NA"),
status = c(0, 1, 1, 0, 1, 1, 0, 1, 1),
treatment = c(10, "NA", 20, 5, "NA", "NA", 30, 100, 10))
Df2 <- data.frame(country = c("A", "A", "A", "A", "B","B", "B"),
time1 = c("1950", "1951", "1953", "1954", "1950", "1951", "1952"),
time2 = c("1951", "1953", "1954", "1955", "1951", "1952", "1954"),
status = c(0, 1, 0, 1, 1, 0, 1),
treatment = c(10, 20, 0, "NA", "NA", 30, 110))
目標是讓它在一個結構中進行 PWP 復發事件分析。Df2 中的處理應該是時間間隔 time1 到 time 2 的處理值的總和。
任何想法我怎么能到達那里?謝謝!
uj5u.com熱心網友回復:
你可以用
library(dplyr)
Df %>%
mutate(across(where(is.character), ~na_if(.x, "NA")),
time1 = as.numeric(coalesce(start_year, year)),
treatment = as.numeric(treatment)) %>%
group_by(country, time1, status) %>%
summarise(treatment = sum(treatment, na.rm = TRUE), .groups = "drop") %>%
group_by(country) %>%
mutate(time2 = lead(time1, default = last(time1) 1)) %>%
select(country, time1, time2, status, treatment) %>%
ungroup()
要得到
# A tibble: 7 x 5
country time1 time2 status treatment
<chr> <dbl> <dbl> <dbl> <dbl>
1 A 1950 1951 0 10
2 A 1951 1953 1 20
3 A 1953 1954 0 5
4 A 1954 1955 1 0
5 B 1950 1951 1 0
6 B 1951 1951 0 30
7 B 1951 1952 1 110
這不完全是您想要的輸出(請參閱我的評論),而是解決您的問題的開始。
uj5u.com熱心網友回復:
Df2 <- Df %>% mutate(episode = data.table::rleid(status))
library(tidyverse)
Df2 <- Df2 %>%
arrange(country, year) %>%
group_by(country, episode) %>%
mutate(time1 = min(year))
Df2 <- Df2 %>%
arrange(country, year) %>%
group_by(country, episode) %>%
mutate(time2 = (max(as.numeric(year) 1)))
我已經創建了一個集識別符號,并設法找出time1和time2每個episode。現在,我仍然需要組合按以下分組的行,episode以便每集有一行顯示treatment. 任何想法如何做到這一點?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/350430.html
上一篇:我可以從閃亮的網站下載我閃亮的應用程式的app.R腳本和資料嗎?
下一篇:如何通過列中的近似值提取行?
