Проблема с поиском и возвратом - PullRequest
0 голосов
/ 23 июня 2018

Я работаю над этой проблемой, для которой я нашел решения в Excel с помощью функции Match и гибридной формулы if / isnumber, а также с помощью операторов Alteryx через if, но у меня возникли проблемы с поиском решения в R.

Пример Excel: =IF(ISNUMBER(SEARCH(C$1,$B2)),1,0)

По существу, проблема заключается в том, что если в строке 1 аудита («ab1») содержится «abc», то строка 1 ячейки abc столбца должна получить1, если не 0. Теперь столбцы могут быть расширены до 1000 возможностей, поэтому код должен быть гибким для работы с изменяющимися именами столбцов.

Текущий

| sid |     audid      | abc | abcd | abcde |
|-----|----------------|-----|------|-------|
| ab1 | abc,abcd,abcde | NA  | NA   | NA    |
| ab2 | abcd           | NA  | NA   | NA    |
| ab3 | abcd,abc       | NA  | NA   | NA    |
| ab4 | abcde          | NA  | NA   | NA    |

Желаемый

| sid |     audid      | abc | abcd | abcde |
|-----|----------------|-----|------|-------|
| ab1 | abc,abcd,abcde |   1 |    1 |     1 |
| ab2 | abcd           |   0 |    1 |     0 |
| ab3 | abcd,abc       |   1 |    1 |     0 |
| ab4 | abcde          |   0 |    0 |     1 |

Любые предложения или советы будут фантастическими.Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Вот один вариант с mtabulate из qdapTools

library(qdapTools)
cbind(df1,  mtabulate(strsplit(df1$audid, ",")))
#  sid          audid abc abcd abcde
#1 ab1 abc,abcd,abcde   1    1     1
#2 ab2           abcd   0    1     0
#3 ab3       abcd,abc   1    1     0
#4 ab4          abcde   0    0     1
0 голосов
/ 23 июня 2018

Если вы хотите придерживаться базы R, тогда поможет вложенный цикл lapply или for.

df <- data.frame(audit = c("abc,abcd,abcde", "abcd", "abc", "abcde"))

#            audit
# 1 abc,abcd,abcde
# 2           abcd
# 3            abc
# 4          abcde

audits <- strsplit(df$audit, ",")

for (row in 1:length(audits)) {
    for (audit in audits[[row]]) {
        df[row, audit] <- 1
    }
}

df[is.na(df)] <- 0

#            audit abc abcd abcde
# 1 abc,abcd,abcde   1    1     1
# 2           abcd   0    1     0
# 3            abc   1    0     0
# 4          abcde   0    0     1
0 голосов
/ 23 июня 2018

Это в основном вопрос преобразования в широкую форму, но сначала вам нужно переставить и разделить строки через запятую.В грамматике Тидиверс,

library(tidyverse)

df <- data_frame(sid = c("ab1", "ab2", "ab3", "ab4"), 
                 audid = c("abc,abcd,abcde", "abcd", "abcd,abc", "abcde"))

df %>% 
  mutate(audid2 = audid,    # duplicate to avoid dropping original
         n = 1) %>%    # add column of existing values to spread to wide form
  separate_rows(audid2) %>%    # separate comma separated strings to long form
  spread(audid2, n, fill = 0)    # reshape to wide form
#> # A tibble: 4 x 5
#>   sid   audid            abc  abcd abcde
#>   <chr> <chr>          <dbl> <dbl> <dbl>
#> 1 ab1   abc,abcd,abcde     1     1     1
#> 2 ab2   abcd               0     1     0
#> 3 ab3   abcd,abc           1     1     0
#> 4 ab4   abcde              0     0     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...