Объединение двух столбцов списка на основе условия - PullRequest
1 голос
/ 14 июля 2020

У меня есть данные, которые выглядят так:

                           extractedNames1                 extractedNames2
1                                                                         
2                                                                 synopsys
3                                                                         
4                                                                   somero
5   cbiz medical management professionals,    cbiz, cbiz, cbiz, cbiz, cbiz
6                                                                         
7                                                                         
8                                                johnson, johnson, johnson
9                                                                  iridium
10       skillsoft,  skillsoft,  skillsoft skillsoft, skillsoft, skillsoft

Он имеет два столбца, которые содержат списки. Я хочу объединить два столбца в один столбец.

Сначала я хотел бы сохранить только значения unique. Таким образом, cbiz medical management professionals будет уникальным значением в столбце extractedNames1, но cbiz, cbiz, cbiz, cbiz, cbiz будет свернуто до cbiz в столбце extractedNames2.

Во-вторых, я хотел бы выполнить слияние на основе условия. Если в extractedNames1 нет результата, возьмите значение unique из extractedNames2. Если результат есть в обоих столбцах, просто сохраните результат из extractedNames1. (Поэтому я хочу объединить два столбца, но только когда в столбце есть пустое место extractedNames1.)

Ожидаемый результат:

extractNamesFina

l
1
2   synopsys
3
4   somero
5   cbiz medical management professions,
6
7
8   Johnson
9   iridium
10  skillsoft

Данные

structure(list(extractedNames1 = list(character(0), character(0), 
    character(0), character(0), " cbiz medical management professionals,", 
    character(0), character(0), character(0), character(0), c(" skillsoft", 
    " skillsoft", " skillsoft")), extractedNames2 = list(character(0), 
    "synopsys", character(0), "somero", c("cbiz", "cbiz", "cbiz", 
    "cbiz", "cbiz"), character(0), character(0), c("johnson", 
    "johnson", "johnson"), "iridium", c("skillsoft", "skillsoft", 
    "skillsoft"))), row.names = c(NA, -10L), class = "data.frame")

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы можете использовать семейство map() в purrr.

library(purrr)
df2 <- as.data.frame(matrix(nrow = nrow(df)))
df2[[1]] <- pmap(map(df, map, unique), ~ if(length(.x)) .x else .y)
df2

#                                         V1
# 1                                         
# 2                                 synopsys
# 3                                         
# 4                                   somero
# 5   cbiz medical management professionals,
# 6                                         
# 7                                         
# 8                                  johnson
# 9                                  iridium
# 10                               skillsoft

Если вы хотите вставить список в data.frame, вам нужно создать data.frame той же длины, что и список. Более удобный способ - использовать tibble(), который может принимать список в качестве входных данных.

library(tibble)
tibble(new = pmap(map(df, map, unique), ~ if(length(.x)) .x else .y))

# # A tibble: 10 x 1
#    new      
#    <list>   
#  1 <chr [0]>
#  2 <chr [1]>
#  3 <chr [0]>
#  4 <chr [1]>
#  5 <chr [1]>
#  6 <chr [0]>
#  7 <chr [0]>
#  8 <chr [1]>
#  9 <chr [1]>
# 10 <chr [1]>

или

as_tibble_col(pmap(map(df, map, unique), ~ if(length(.x)) .x else .y), column_name = "new")
0 голосов
/ 14 июля 2020

Вы можете попробовать это:

data1 <- paste(test$extractedNames1, test$extractedNames2, sep = " ")
extractedNamesFina <- data.frame(Output1 = vapply(strsplit(data1, " +"), function(x) paste(unique(x), collapse = " "), character(1)))

Результат:

                                                                  Output1
1                                                            character(0)
2                                                   character(0) synopsys
3                                                            character(0)
4                                                     character(0) somero
5        cbiz medical management professionals, c("cbiz", "cbiz", "cbiz")
6                                                            character(0)
7                                                            character(0)
8                         character(0) c("johnson", "johnson", "johnson")
9                                                    character(0) iridium
10 c(" skillsoft", " skillsoft") c("skillsoft", "skillsoft", "skillsoft")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...