数据框采用两列,并根据值采取措施

时间:2020-03-28 13:52:31

标签: r

我有一个数据框,其中有两列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将成为两项。

3 个答案:

答案 0 :(得分:1)

我们可以使用FK合并FK_1unite列,使用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