gpt4 book ai didi

r - 有条件地逐列替换领先和落后的 NA

转载 作者:行者123 更新时间:2023-12-02 07:17:11 25 4
gpt4 key购买 nike

我很难根据第一个和最后一个非缺失值的不同条件以不同方式填充 NA。
背景:人们接受白内障手术并将晶状体状态从 phak 更改为 pseudo。如果第一个非缺失值是“phak”,则这一定存在于之前未记录的观察中。如果最后一个非缺失值是'pseudo',这可以继续进行,因为状态不能变回'phak'。
不能简单地使用像 zoo::na.locf 这样的函数,因为如果开关之间有 NA,我们将无法判断操作的确切时间,这些值应该保持为 NA . Thus, it is not a "sandwich" problem

library(tidyverse)

a <- c(NA, 'phak', NA, 'pseudo', NA)
b <- c(NA, 'pseudo', NA, NA, NA)
c <- c('phak', 'phak', NA, NA, NA)

dfoo <- data.frame(a,b,c, stringsAsFactors = FALSE) %>% gather(eye, status)
dfoo
#> eye status
#> 1 a <NA>
#> 2 a phak
#> 3 a <NA>
#> 4 a pseudo
#> 5 a <NA>
#> 6 b <NA>
#> 7 b pseudo
#> 8 b <NA>
#> 9 b <NA>
#> 10 b <NA>
#> 11 c phak
#> 12 c phak
#> 13 c <NA>
#> 14 c <NA>
#> 15 c <NA>

所需的数据框:

#>      eye  status
#> 1 a phak
#> 2 a phak
#> 3 a <NA>
#> 4 a pseudo
#> 5 a pseudo
#> 6 b <NA>
#> 7 b pseudo
#> 8 b pseudo
#> 9 b pseudo
#> 10 b pseudo
#> 11 c phak
#> 12 c phak
#> 13 c <NA>
#> 14 c <NA>
#> 15 c <NA>

下面的方法适用于一个简单的向量,但我很难在一个数据框中按组使用这个解决方案。

# by vector:
# first conditionally replace leading NAs
if(a[min(which(!is.na(a)))] == 'phak') {a[1 : min(which(!is.na(a)))] <- 'phak'}
# next conditionally replace last NAs
if(a[max(which(!is.na(a)))] == 'pseudo') {a[max(which(!is.na(a))): length(a)] <- 'pseudo'}

a
#> [1] "phak" "phak" NA "pseudo" "pseudo"

reprex package 创建于 2019-12-16 (v0.3.0)

最佳答案

这是一种可能的 tidyverse 方法:

  1. group_by视线水平
  2. 创建两个临时列 phakpseudo分别替换所有"pseudo"值和 "phak"NA
  3. fill phak列使用 .direction = "up"
  4. fill pseudo列使用 .direction = "down"
  5. coalesce phakpseudo列回到列中 status
library(tidyverse)

dfoo %>%
group_by(eye) %>%
mutate(
phak = na_if(status, "pseudo"),
pseudo = na_if(status, "phak")
) %>%
fill(phak, .direction = "up") %>%
fill(pseudo, .direction = "down") %>%
transmute(status = coalesce(phak, pseudo)) %>%
ungroup()
#> # A tibble: 15 x 2
#> eye status
#> <chr> <chr>
#> 1 a phak
#> 2 a phak
#> 3 a <NA>
#> 4 a pseudo
#> 5 a pseudo
#> 6 b <NA>
#> 7 b pseudo
#> 8 b pseudo
#> 9 b pseudo
#> 10 b pseudo
#> 11 c phak
#> 12 c phak
#> 13 c <NA>
#> 14 c <NA>
#> 15 c <NA>

数据

dfoo <- structure(list(eye = c("a", "a", "a", "a", "a", "b", "b", "b", 
"b", "b", "c", "c", "c", "c", "c"), status = c(NA, "phak", NA,
"pseudo", NA, NA, "pseudo", NA, NA, NA, "phak", "phak", NA, NA,
NA)), row.names = c(NA, -15L), class = "data.frame")

关于r - 有条件地逐列替换领先和落后的 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59356541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com