我有这个例子 df
df = data.frame(id = c('1E','1F','2E','2F','3F','4F'),
statut = c('A','A','B','B','A','A') )
对于每个重复数字的id,我希望当重复id的字母是E时状态变为NA
我希望得到以下输出:
id statut
1 1E <NA>
2 1F A
3 2E <NA>
4 2F B
5 3F A
6 4F A
这里有一组符合你预期输出的条件:
idx <- substr(df$id, 1, 1) == dplyr::lead(substr(df$id, 1, 1)) & substr(df$id, 2, 2) == "E"
df$statut[idx] <- NA
id statut
1 1E <NA>
2 1F A
3 2E <NA>
4 2F B
5 3F A
6 4F A
或者在更 dplyr 友好的管道中:
library(tidyr)
library(dplyr)
df %>%
separate_wider_regex(id, c(number = "\\d+", letter = ".*")) %>%
group_by(number) %>%
mutate(statut = ifelse(n() > 1 & letter == "E", NA, statut))
在这种情况下,我个人更喜欢使用
data.table
,因为它的效率和简单性。
library(data.table)
# Set the data.frame to data.table
setDT(df)
# Use ifelse to test the condition if the last character in every single value in id
# is E or not, and if yes, replace it with NA
df[ , statut := ifelse(substr(id, 2, 2), NA, statut)]
另一个解决方案是使用逻辑 grep 来做同样的事情:
df[ , statut := ifelse(grepl("E", id), NA, statut)]
我希望这有帮助。
您可以先
extract
id
中的数字和字母,然后将E
设置为NA
:
df %>%
extract(id, into = c("id_n", "id_g"), regex = "(.)(.)", remove = FALSE) %>%
mutate(statut = na_if(id_g, "E")) %>%
select(-c(matches("_")))