我有一个类似以下的df:
ID Comment1 Comment2
X9999 text text
X9999.000 text text
Y8888 text text
Y8888.111 text text
Z7777.555 text text
在第一列中,有Id和子Id。Id类似X9999,子Id类似X9999.999。我如何让R检查是否有没有相应Id行的太阳Id行,以及是否没有插入Id行?
您可以使用dplyr
对排除.xxx部分的唯一代码执行full_join
。
library(dplyr)
df2 <- full_join(df,data.frame(ID=unique(gsub('\..*','',df$ID))))
我们可以按ID
(减去子id组件(进行分组,然后我们可以找到任何没有主id的组。然后,如果没有主id,我们可以使用uncount
来复制行。然后,对于第一行,我们可以删除子id组件。
library(tidyverse)
df %>%
group_by(grp = str_replace_all(ID, "\..*", "")) %>%
mutate(duplicate_row = !any(ID == grp)) %>%
uncount(case_when(duplicate_row ~ 2, TRUE ~ 1)) %>%
mutate(ID = ifelse(row_number() == 1 &
duplicate_row == TRUE, str_replace_all(ID, "\..*", ""), ID)) %>%
ungroup %>%
select(names(df))
输出
ID Comment1 Comment2
<chr> <chr> <chr>
1 X9999 text text
2 X9999.000 text text
3 Y8888 text text
4 Y8888.111 text text
5 Z7777 text text
6 Z7777.555 text text
数据
df <- structure(list(ID = c("X9999", "X9999.000", "Y8888", "Y8888.111",
"Z7777.555"), Comment1 = c("text", "text", "text", "text", "text"
), Comment2 = c("text", "text", "text", "text", "text")), class = "data.frame", row.names = c(NA,
-5L))