Dataframe занимает два столбца и принимает меры в зависимости от значения - PullRequest
0 голосов
/ 28 марта 2020

У меня есть фрейм данных, который имеет два столбца 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 ]

1 голос
/ 28 марта 2020

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*$"))
1 голос
/ 28 марта 2020

Мы можем объединить столбцы 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
0 голосов
/ 28 марта 2020

Я думал о слиянии, но не уверен, что это лучший вариант:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...