我需要执行一个数据库操作,将新数据添加到现有表中,然后为新行分配一个惟一的id。我在R中询问这一点,这样在尝试用sql或pyspark重写它之前,我可以弄清楚逻辑。
假设我已经将新数据添加到现有数据中。下面是它可能看起来的简化版本:
library(tidyverse)
df <- tibble(id = c(1, 2, 3, NA, NA),
descriptions = c("dodgers", "yankees","giants", "orioles", "mets"))
# A tibble: 5 x 2
id descriptions
<dbl> <chr>
1 1 dodgers
2 2 yankees
3 3 giants
4 NA orioles
5 NA mets
我想要的是:
# A tibble: 5 x 2
id descriptions
<dbl> <chr>
1 1 dodgers
2 2 yankees
3 3 giants
4 4 orioles
5 5 mets
A我不能使用带有rowid_to_columns
id的arrange
被删除。
为了在不更改现有行的情况下获得NA
行的唯一id,我想获取id列的最大值,添加1,用该值替换NA,然后移到下一行。我的直觉是这样做的:df %>% mutate(new_id = max(id, na.rm = TRUE) + 1)
,但这只是最大值加1,而不是每行新的最大值。我觉得我可以用一个映射函数来做到这一点,但我尝试返回的结果与输入数据帧相同:
df %>%
mutate(id = ifelse(is.na(id),
map_dbl(id, ~max(.) + 1, na.rm = FALSE),
id))
# A tibble: 5 x 2
id descriptions
<dbl> <chr>
1 1 dodgers
2 2 yankees
3 3 giants
4 NA orioles
5 NA mets
提前感谢--现在如果有人可以直接用sql帮助我,那也是一个加分!
发布于 2021-06-28 20:27:33
下面是一种方法,其中我们基于NA值将max
值与逻辑向量的累积和相加,并将coalesce
与原始列'id‘相加
library(dplyr)
df <- df %>%
mutate(id = coalesce(id, max(id, na.rm = TRUE) + cumsum(is.na(id))))
-output
df
# A tibble: 5 x 2
id descriptions
<dbl> <chr>
1 1 dodgers
2 2 yankees
3 3 giants
4 4 orioles
5 5 mets
发布于 2021-06-28 20:31:46
SQL选项,使用sqldf
进行演示:
sqldf::sqldf("
with cte as (
select max(id) as maxid from df
)
select cte.maxid + row_number() over () as id, df.descriptions
from df
left join cte where df.id is null
union
select * from df where id is not null")
# id descriptions
# 1 1 dodgers
# 2 2 yankees
# 3 3 giants
# 4 4 orioles
# 5 5 mets
https://stackoverflow.com/questions/68169540
复制相似问题