Несколько перекрывающихся операторов ИЛИ в R - PullRequest
0 голосов
/ 25 февраля 2020

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

+-----------+------------+---------------+
| Land Type | Owner Type | Operator Type |
+-----------+------------+---------------+
| F         | P          | F             |
| F         | F          | F             |
| F         | P          | O             |
| T         | F          | P             |
+-----------+------------+---------------+

Я хотел бы добавить столбец с меткой «allType», который принимает оператор OR для каждого столбца и добавляет поле. Таким образом, если в строке есть все F, то соответствующий allType должен быть просто F. Но если в строке есть сочетание F, P, T или O, тогда allType должен отражать это.

+----------+-----------+--------------+--------------------------+
| landType | ownerType | operatorType |         allType          |
+----------+-----------+--------------+--------------------------+
| F        | P         | F            | Federal, Pprivate        |
| F        | F         | F            | Federal                  |
| F        | P         | O            | Federal, Private, Other  |
| T        | F         | P            | Tribal, Federal, Private |
+----------+-----------+--------------+--------------------------+

В настоящее время я выполняю оператор OR, который выглядит следующим образом, но они не складываются с запятыми так, как мне бы хотелось. И это не учитывает двойной счет, который мне нужен.

# display private facility tag
data$allType[data$landType == 'P' | data$ownerType == 'P' | adata$operatorType == 'P'] ='Private'

# display Federal facility tag
data$allType[data$landType == 'F' | data$ownerType == 'F' | adata$operatorType == 'F'] ='Federal'

# display Federal facility tag
data$allType[data$landType == 'T' | data$ownerType == 'T' | adata$operatorType == 'T'] ='Tribal'

# display Federal facility tag
data$allType[data$landType == 'O' | data$ownerType == 'O' | adata$operatorType == 'O'] ='Other'

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

akrun, как всегда правильно и быстро, но в то же время решение base R, использующее именованные векторы:

df <- data.frame( "ownerType" = c("t","p", "f"),
                  "landType" = c("t","o","t"),
                  stringsAsFactors = FALSE)
df

vector <- c("Tribal", "Federal", "Private", "Other")
names(vector) <- c("t","p",'f', "o")

df$allType <- apply(df, 1, function(x) paste( vector[x], collapse = ", "))
df        
1 голос
/ 25 февраля 2020

Один из вариантов - создать именованный вектор, соответствующий значениям в каждом из столбцов и unite столбцам

library(dplyr)
library(tidyr)
df1 %>%
   mutate_all(~ setNames(c('Federal', "Private", "Other", "Tribal"), 
             c("F", "P", "O", "T"))[.]) %>% 
   unite(alllType, everything(), sep=", ") %>%
   bind_cols(df1, .)
# A tibble: 4 x 4
#  `Land Type` `Owner Type` `Operator Type` alllType                 
#* <chr>       <chr>        <chr>           <chr>                    
#1 F           P            F               Federal, Private, Federal
#2 F           F            F               Federal, Federal, Federal
#3 F           P            O               Federal, Private, Other  
#4 T           F            P               Tribal, Federal, Private 

Если нам не нужны повторяющиеся записи,

library(purrr)
df1 %>% 
   mutate_all(~ setNames(c('Federal', "Private", "Other", "Tribal"), 
          c("F", "P", "O", "T"))[.]) %>%
  transmute(allType =  pmap_chr(., ~ toString(unique(c(...))))) %>% 
  bind_cols(df1, .)
# A tibble: 4 x 4
#  `Land Type` `Owner Type` `Operator Type` allType                 
#* <chr>       <chr>        <chr>           <chr>                   
#1 F           P            F               Federal, Private        
#2 F           F            F               Federal                 
#3 F           P            O               Federal, Private, Other 
#4 T           F            P               Tribal, Federal, Private

данные

df1 <- structure(list(`Land Type` = c("F", "F", "F", "T"), `Owner Type` = c("P", 
"F", "P", "F"), `Operator Type` = c("F", "F", "O", "P")), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))
...