我有一個寬資料集,每人 1 行。每個人都有一組 12 個變數,代表一年中每個月的訪問。如果一個人一個月沒有訪問,它目前會顯示 NA。如果一個人在一個月內多次訪問,次數就是訪問次數。例如,一個病人在二月份第一次就診,他們就診了 2 次。一月列是 NA,因為他們當時沒有被看到,二月列是 2,因為他們在那個月有 2 次訪問。如果該人有訪問或沒有訪問,則該人的剩余月份將相應地填寫。
我的目標是找到第一個非缺失值,然后在他們第一次訪問后沒有訪問的任何幾個月都需要更改為 0。我仍然希望在他們第一次訪問之前保留幾個月作為 NA。我提供了“擁有”和“想要”的資料集。
我曾嘗試使用回圈、if 陳述句和函式,但沒有任何成功。有沒有人有這種型別的代碼的經驗?
有:
|ID | Jan | Feb | Mar | Apr | May | June | Jul |
|:--|:---:|:---:|:---:|:---:|:---:|:----:|:---:|
| 1 | NA | 1 | 1 | 2 | NA | NA | NA |
| 2 | NA | NA | NA | 1 | NA | NA | NA |
| 3 | 1 | NA | 1 | 3 | 1 | NA | NA |
| 4 | NA | NA | NA | NA | NA | 1 | 1 |
想:
|ID | Jan | Feb | Mar | Apr | May | June | Jul |
|:--|:---:|:---:|:---:|:---:|:---:|:----:|:---:|
| 1 | NA | 1 | 1 | 2 | 0 | 0 | 0 |
| 2 | NA | NA | NA | 1 | 0 | 0 | 0 |
| 3 | 1 | 0 | 1 | 3 | 1 | 0 | 0 |
| 4 | NA | NA | NA | NA | NA | 1 | 1 |
uj5u.com熱心網友回復:
我們可以使用矢量化選項 withmax.col來查找除每行的第一列之外的第一個非 NA 元素的列索引。然后,通過檢查此replicated 索引是否小于colum 索引和 ( &) 來創建一個邏輯矩陣,如果這些值NA要回傳matrix我們用來對資料進行子集化并將 ( <-)分配給 0的邏輯值
df1[-1][col(df1[-1]) > max.col(!is.na(df1[-1]), 'first')[
row(df1[-1])] & is.na(df1[-1])] <- 0
-輸出
> df1
ID Jan Feb Mar Apr May June Jul
1 1 NA 1 1 2 0 0 0
2 2 NA NA NA 1 0 0 0
3 3 1 0 1 3 1 0 0
4 4 NA NA NA NA NA 1 1
或使用 apply
df1[] <- t(apply(df1[-1], 1, FUN = function(x)
replace(x, seq_along(x) > which(!is.na(x))[1] & is.na(x), 0)))
資料
df1 <- structure(list(ID = 1:4, Jan = c(NA, NA, 1L, NA), Feb = c(1L,
NA, NA, NA), Mar = c(1L, NA, 1L, NA), Apr = c(2L, 1L, 3L, NA),
May = c(NA, NA, 1L, NA), June = c(NA, NA, NA, 1L), Jul = c(NA,
NA, NA, 1L)), class = "data.frame", row.names = c(NA, -4L
))
uj5u.com熱心網友回復:
甲tidyverse使用樞轉,分組和填充液:
library(tidyverse)
df1 <- df1 %>%
pivot_longer(-ID) %>%
group_by(ID) %>%
mutate(temp = 1 * !cumall(is.na(value))) %>%
fill(temp) %>%
mutate(value = ifelse(temp == 1 & is.na(value), 0, value)) %>%
pivot_wider(-temp, names_from = name, values_from = value)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/356536.html
標籤:r
上一篇:使用R中的另一個資料框列完成列名
