R语言 如何用另一行的信息填充一行

0yg35tkg  于 2024-01-03  发布在  其他
关注(0)|答案(3)|浏览(152)

我有一个庞大的数据集,其结构与此类似:

FMID <- c(101,101,102,102,103,103,104,104)
IID <- c("101A","101B", "102A", "102B", "103A", "103B","104A", "1034")
PC1 <- c(2,NA,3,4,NA,4,NA,3)
ZY <- c(1,1,1,1,3,3,1,1)

df <- as.data.frame(cbind(FMID,IID, PC1, ZY))

字符串
我需要在变量PC1中复制一些值
因此,对于具有相同FMID且ZY==1的情况(如果其中一个,A或B,具有NA),我想使用具有相同FMID的另一个情况的信息来填充NA。
这里是预期的结果:

FMID <- c(101,101,102,102,103,103)
IID <- c("101A","101B", "102A", "102B", "103A", "103B","104A", "1034")
PC1 <- c(2,2,3,4,NA,4,3,3)
ZY <- c(1,1,1,1,3,3,1,1)

df_Expected <- as.data.frame(cbind(FMID,IID, PC1, ZY))


我已经尝试了ifelse,但我不能使它工作。提前谢谢你。

fjnneemd

fjnneemd1#

另一种方式如下所示:

df %>% 
    group_by(FMID) %>%
    mutate(na_loc = is.na(PC1)& ZY !=1) %>%
    fill(PC1, .direction = 'downup') %>%
    mutate(PC1 = `is.na<-`(PC1, na_loc), na_loc = NULL)

# A tibble: 8 × 4
# Groups:   FMID [4]
  FMID  IID   PC1   ZY   
  <chr> <chr> <chr> <chr>
1 101   101A  2     1    
2 101   101B  2     1    
3 102   102A  3     1    
4 102   102B  4     1    
5 103   103A  NA    3    
6 103   103B  4     3    
7 104   104A  3     1    
8 104   1034  3     1

字符串

deikduxw

deikduxw2#

data.table

FMID <- c(101,101,102,102,103,103)
IID <- c("101A","101B", "102A", "102B", "103A", "103B")
PC1 <- c(2,NA,3,4,NA,4)
ZY <- c(1,1,1,1,3,3)

df <- as.data.frame(cbind(FMID,IID, PC1, ZY))

library(data.table)
setDT(df)[ZY == 1, PC1 := zoo::na.locf(PC1), by = FMID][]
#>    FMID  IID  PC1 ZY
#> 1:  101 101A    2  1
#> 2:  101 101B    2  1
#> 3:  102 102A    3  1
#> 4:  102 102B    4  1
#> 5:  103 103A <NA>  3
#> 6:  103 103B    4  3

字符串
创建于2023-12-13使用reprex v2.0.2

hsgswve4

hsgswve43#

您可以使用replace by group将PC1中的NA s替换为同一FMID组中的非NA值,仅当ZY为1时。

library(dplyr)

df |>
  mutate(PC1 = replace(PC1, is.na(PC1) & ZY == 1, na.omit(PC1)), .by = FMID)

#   FMID  IID  PC1 ZY
# 1  101 101A    2  1
# 2  101 101B    2  1
# 3  102 102A    3  1
# 4  102 102B    4  1
# 5  103 103A <NA>  3
# 6  103 103B    4  3

字符串

相关问题