使用四个条件转换R Dataframe 中的值

fykwrbwg  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(141)

我有以下数据框:

Group   Number    Letter
    G1        1         A
    G1        NA        B
    G1        NA        X
    G1        NA        D
    G2        1         A
    G2        NA        B
    G2        NA        C
    G2        NA        X
    G3        1         A
    G3        2         B
    G3        3         C
    G3        NA        X
    G4        1         D
    G4        NA        E
    G4        NA        F
    G4        NA        X

我希望使用以下四个条件在每个组中转换此 Dataframe :
1.如果"字母"列中的字母等于"X",则"数字"列中所有前面的NA行的字母都将更改为"U"。
1.如果前面的行在"编号"列中有一个数字而不是NA,则它们保持不变。
1.字母列中带有X的行不会更改。
1.如果带有X的行的前一行在字母列中带有F,则该组中的所有行都不会更改(例如,我的数据框中G4组中的所有行都不会更改)
这应产生如下所示的 Dataframe :

Group   Number    Letter
    G1        1         A
    G1        NA        U
    G1        NA        X
    G1        NA        D
    G2        1         A
    G2        NA        U
    G2        NA        U
    G2        NA        X
    G3        1         A
    G3        2         B
    G3        3         C
    G3        NA        X
    G4        1         D
    G4        NA        E
    G4        NA        F
    G4        NA        X

我怎样才能在R中做到这一点,最好使用dplyr?

oxf4rvwz

oxf4rvwz1#

试试看

library(dplyr)
df1 %>% 
  group_by(Group) %>%
   mutate(Letter = {i1 <- which(is.na(Number))
               i2 <- match("X", Letter)
    if(Letter[i2-1] != "F")replace(Letter, i1[i1 < i2], 'U') else Letter}) %>%
   ungroup
  • 输出
# A tibble: 16 × 3
   Group Number Letter
   <chr>  <int> <chr> 
 1 G1         1 A     
 2 G1        NA U     
 3 G1        NA X     
 4 G1        NA D     
 5 G2         1 A     
 6 G2        NA U     
 7 G2        NA U     
 8 G2        NA X     
 9 G3         1 A     
10 G3         2 B     
11 G3         3 C     
12 G3        NA X     
13 G4         1 D     
14 G4        NA E     
15 G4        NA F     
16 G4        NA X

或使用data.table

library(data.table)
setDT(df1)[is.na(Number), Letter := 
   if(!paste(Letter, collapse = "") %like% "FX") 
   replace(Letter, seq_len(match("X", Letter)-1), "U") , Group]
  • 输出
> df1
    Group Number Letter
 1:    G1      1      A
 2:    G1     NA      U
 3:    G1     NA      X
 4:    G1     NA      D
 5:    G2      1      A
 6:    G2     NA      U
 7:    G2     NA      U
 8:    G2     NA      X
 9:    G3      1      A
10:    G3      2      B
11:    G3      3      C
12:    G3     NA      X
13:    G4      1      D
14:    G4     NA      E
15:    G4     NA      F
16:    G4     NA      X

数据

df1 <- structure(list(Group = c("G1", "G1", "G1", "G1", "G2", "G2", 
"G2", "G2", "G3", "G3", "G3", "G3", "G4", "G4", "G4", "G4"), 
    Number = c(1L, NA, NA, NA, 1L, NA, NA, NA, 1L, 2L, 3L, NA, 
    1L, NA, NA, NA), Letter = c("A", "B", "X", "D", "A", "B", 
    "C", "X", "A", "B", "C", "X", "D", "E", "F", "X")),
 class = "data.frame", row.names = c(NA, 
-16L))

相关问题