我有一个数据框,其中有两列fk(foreign_key)和fk_1。在数据集中,它们都称为fk。
我想摆脱fk_1,以便fk只有1列。 fk可以包含数字和#哈希码,fk_1也可以包含。
现在我只想保留数字,但是如果fk和fk_1有数字。我想创建一个采用fk_1值的新条目,以便旧条目可以采用fk值
示例:
FK FK-1 Name Expected Result
1 #abc07zy Test 1
#abc2Z90 2 Beta 2
3 4 Alpha 3 and a new entry with value 4
总列表如下:
FK Name
1 Test
2 Beta
3 Alpha
4 Alpha
我尝试对ifelse
上的grepl
和"#"
进行操作,但这仅适用于一列。
而且我不知道如何实现数字3和4将成为两项。
答案 0 :(得分:1)
我们可以使用FK
合并FK_1
和unite
列,使用str_extract_all
从列中获取所有数字,并在单独的行中获取数据。
library(dplyr)
library(tidyr)
df %>%
unite(FK, FK, FK_1, sep = " ") %>%
mutate(FK = stringr::str_extract_all(FK, '\\b\\d+\\b')) %>%
unnest(FK)
# A tibble: 4 x 2
# FK Name
# <chr> <fct>
#1 1 Test
#2 2 Beta
#3 3 Alpha
#4 4 Alpha
答案 1 :(得分:1)
pivot_longer()
和str_detect()
解决方案
#required libraries
library(dplyr)
library(tidyr)
library(stringr)
#example data
example <- data.frame(FK = c(1, "#abc07zy", 3),
FK_1 = c("#abc2Z90", 2, 4),
Name = c("Test", "Beta", "Alpha"),
stringsAsFactors = F)
#solution
solution <- example %>%
pivot_longer(c("FK", "FK_1"), values_to = "FK") %>%
filter(str_detect(FK, "^\\d*$"))
答案 2 :(得分:0)
我在这里考虑过合并,但是不确定是否是最佳选择:
library(dplyr)
library(tidyr)
df %>%
mutate(FK=ifelse(grepl("^#", FK), NA, FK),
FK_1=ifelse(grepl("^#", FK_1), NA, FK_1),
FK=coalesce(FK, FK_1)) %>%
pivot_longer(cols=c(FK, FK_1), values_drop_na=TRUE) %>%
distinct(FK=value, Name)
# A tibble: 4 x 2
FK Name
<chr> <chr>
1 1 Test
2 2 Beta
3 3 Alpha
4 4 Alpha