如何根据另一列中存在字母的条件将一列的特定值变成NA?

问题描述 投票:0回答:3

我有这个例子 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
r dataframe conditional-statements multiple-columns na
3个回答
0
投票

这里有一组符合你预期输出的条件:

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))

0
投票

在这种情况下,我个人更喜欢使用

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)]

我希望这有帮助。


0
投票

您可以先

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("_")))
© www.soinside.com 2019 - 2024. All rights reserved.