Более компактная версия цикла "ifelse grepl" - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть data.frame с несколькими столбцами, и я хотел бы добавить еще один столбец в конце df, содержащий конкретные строки, основанные на том, что присутствует в другом столбце.

например, яиметь:

df <- data.frame(
  "Therapeutic.Use" = c("Epilepsy", "Cancer", "Angina"),
  "Compound" = c("XXX", "YYY", "KKK"))

, и я использую следующее утверждение для извлечения информации на основе того, что присутствует в столбце «Терапевтическое использование».

df$Target.Organ <- NA
df$Target.Organ <- ifelse(
  grepl("Epilepsy", df$Therapeutic.Use), "Brain",
    ifelse(grepl("Cancer", df$Therapeutic.Use), "Cancer",
      ifelse(grepl("Angina", df$Therapeutic.Use), "Heart", "Other")))

И так далее.У меня есть таблица с 500 различными видами использования, поэтому мне было бы легче не писать 500 ifelse заявлений.Возможно ли это?

Заранее спасибо за помощь:)

Ответы [ 4 ]

0 голосов
/ 25 сентября 2018

В вашем поиске data.table() пар ключ-значение используйте data.table::setkey(), затем dplyr::mutate(), чтобы добавить новый столбец в df:

library(data.table)
library(dplyr)

df <- data.frame(
  "Therapeutic.Use" = c("Epilepsy", "Cancer", "Angina"),
  "Compound" = c("XXX", "YYY", "KKK"),
  stringsAsFactors = F)

hash <- data.table(
  "Therapeutic.Use" = c("Epilepsy", "Cancer", "Angina"),
  "Organ" = c("Brain", "Cancer", "Heart"))
setkey(hash, Therapeutic.Use)

df2 <-  mutate(df, Organ = hash[df$Therapeutic.Use]$Organ)

if(any(is.na(df2$Organ)))
  df2[is.na(df2$Organ), ]$Organ <- "Other"

df2

#   Therapeutic.Use Compound  Organ
# 1        Epilepsy      XXX  Brain
# 2          Cancer      YYY Cancer
# 3          Angina      KKK  Heart
0 голосов
/ 24 сентября 2018

Создайте таблицу поиска для left_join на .. Не забудьте использовать stringsAsFactors = FALSE, иначе вы получите уровень факторов вместо символа ...

df <- data.frame("Therapeutic.Use" = c("Epilepsy", "Cancer", "Angina"), 
                 "Compound" = c("XXX", "YYY", "KKK"),
                 stringsAsFactors = FALSE)


library ( dplyr )
#create lookup-table (or read in from a csv/excel)
lookup <- data.frame( Therapeutic.Use = unique( df$Therapeutic.Use ),
                      Target.organ = c("Brain", "Cancer", "Heart" ),
                      stringsAsFactors = FALSE )

df %>% 
  #perform left join
  left_join( lookup ) %>% 
  #replace NA in Target.organ with "Other"
  mutate( Target.organ = ifelse( is.na( Target.organ ), "Other", Target.organ ) )


#   Therapeutic.Use Compound Target.organ
# 1        Epilepsy      XXX        Brain
# 2          Cancer      YYY       Cancer
# 3          Angina      KKK        Heart                                   
0 голосов
/ 24 сентября 2018

Просто создайте информационный блок с органами и терапевтическими средствами, а затем создайте левое соединение.

# Your dataframe
df <- data.frame("Therapeutic.Use" = c("Epilepsy", "Cancer", "Angina"), "Compound" = c("XXX", "YYY", "KKK"))

# Organ dataframe
df2 <- data.frame(Therapeutic.Use = c("Epilepsy", "Cancer", "Angina"),
                  organ = c("Brain", "Cancer", "Heart"))

# Joining dataframes
library(dplyr)
df_done <- left_join(df, df2)

> df_done
  Therapeutic.Use Compound  organ
1        Epilepsy      XXX  Brain
2          Cancer      YYY Cancer
3          Angina      KKK  Heart
0 голосов
/ 24 сентября 2018

Попробуйте case_when:

df%>%
   mutate(Target.Organ=case_when(
     grepl("Epilepsy", Therapeutic.Use)~"Brain",
     grepl("Cancer", Therapeutic.Use)~ "Cancer",
     grepl("Angina", Therapeutic.Use)~ "Heart",
     T~"Other"  
   ))
  Therapeutic.Use Compound Target.Organ
1        Epilepsy      XXX        Brain
2          Cancer      YYY       Cancer
3          Angina      KKK        Heart
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...