如何在前一行的基础上在接下来的几行中插入值

tzxcd3kk  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(278)

这个问题在这里已经有答案了

用最新的非na值替换nas(18个答案)
两年前关门了。
我有一张这样的table

Id   A    B     
  1  11   event1  
  2  12   event2   
  3  00   event1
  4  00   event2
  5  11   event1
  6  00   event2
  7  00   event3
  8  13   event1

我想把以前的值改为00。输出将如下所示

Id  A   B 
  1  11   event1
  2  12   event2
  3  12   event1
  4  12   event2
  5  11   event1
  6  11   event2
  7  11   event3
  8  13   event1

在r或mysql中有没有办法做到这一点。谢谢

w3nuxt5m

w3nuxt5m1#

这是一个在r做这个的单行程序。基本上,我们用 NA 使用 zoo::na.locf() 填充最后一个非na值,即。

transform(d1, A = zoo::na.locf(replace(A, A == 0, NA)))

所以,

Id  A      B
1  1 11 event1
2  2 12 event2
3  3 12 event1
4  4 12 event2
5  5 11 event1
6  6 11 event2
7  7 11 event3
8  8 13 event1

作为@g。grothendieck笔记,你的 A 变量似乎是一个字符。如果是这样的话,

transform(d1, A = na.locf0(replace(A, A == "00", NA)))
6vl6ewon

6vl6ewon2#

您可以在mysql中使用相关子查询:

SELECT t.id, 
       (CASE WHEN A <> '00' 
             THEN A
             ELSE (SELECT t1.A
                   FROM table t1
                   WHERE t1.id < t.id AND t1.A <> '00'
                   ORDER BY t1.id DESC
                   LIMIT 1
                  )
        END) AS A, B
FROM table t;
kgqe7b3p

kgqe7b3p3#

R 你可以用 tidyr 功能 fill . 首先将所有0更改为na mutate ,则fill函数将用最后一个值替换它。

library(dplyr)
library(tidyr)
df %>% mutate(A = ifelse(A==0,NA,A)) %>% fill(A)

# Id  A      B

# 1  1 11 event1

# 2  2 12 event2

# 3  3 12 event1

# 4  4 12 event2

# 5  5 11 event1

# 6  6 11 event2

# 7  7 11 event3

# 8  8 13 event1

相关问题