我有一个类似的表
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中做到这一点。感谢
您可以在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;
这里有一个在R中执行此操作的一行。基本上,我们用NA
替换0s,并使用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
As@G。Grothendieck指出,您的A
变量似乎是一个字符。如果是这样的话,
transform(d1, A = na.locf0(replace(A, A == "00", NA)))
在R
中,可以使用tidyr
函数fill
执行此操作。首先用mutate
将所有0更改为NA,然后填充函数将用最后一个值替换它。
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