Заменить все строки числами в зависимости от условий - PullRequest
2 голосов
/ 17 февраля 2020

У меня есть столбец данных, который описывает возможные заболевания. Я пытаюсь изменить эти качественные значения на количественные. Так, например, при установке условий, таких как «если строка содержит слова« артериальное давление », удалите все символы и замените их на 3, если в строке« сердце »замените на 2, если в строке« диабет »или« заболевание почек »замените равным 1, если любое другое условие заменяется на 0,5 "

Например, мои данные выглядят следующим образом:

Gene     Condition
Gene1    Name=Asymmetrical dimethylarginine level, Name=Bipolar disorder and schizophrenia, Name=3-hydroxypropylmercapturic acid levels in smoker
Gene2    Name=blood pressure, Name=diabetes
Gene3    Name=heart disease
Gene4    Name=Childhood ear infection
Gene5    NA
Gene6    Name=kidney disease

Вывод, который я пытаюсь получить на основе упомянутых выше условий:

Gene Condition
Gene1    0.5
Gene2    3
Gene3    2
Gene4    0.5
Gene5    NA
Gene6    1

Я новичок в R и поэтому не уверен, что способ, которым я пытаюсь, является лучшим, но я пытаюсь выполнить свои условия, чтобы заменить указанные строки c (но не все символы ), производя несколько чисел в строке (смешанных со строками), если выполняется более 1 условия, затем применяя функцию getmax для каждой строки, чтобы получить наибольшее доступное число. Однако я застрял на настройке условий для выполнения цепочки в номер разговора. Я пытался сделать:

data$condition[data$condition == "blood pressure"] <- "3"
data$condition[data$condition == "heart disease"] <- "2"
data$condition[data$condition == "diabetes" | "kidney disease"] <- "1"
data$condition[data$condition == "Name" && !"diabetes" | "kidney disease" | "blood pressure" | "heart disease"] <- "0.5"

Однако это дает ошибку, что «объект типа« замыкание »не является поднабором», и по крайней мере для этого подхода я не могу найти решение за эту ошибку онлайн. Буду признателен за любую помощь.

Пример данных (при первой попытке предоставить данные, пожалуйста, дайте мне знать, если что-то не так):

structure(list(Gene = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5", 
"Gene6"), Condition = c("    Name=Asymmetrical dimethylarginine level, Name=Bipolar disorder and schizophrenia, Name=3-hydroxypropylmercapturic acid levels in smoker", 
"    Name=blood pressure, Name=diabetes", "Name=heart disease", 
"Name=Childhood ear infection", NA, "Name=kidney disease")), row.names = c(NA, 
-6L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x000001bea99a1ef0>)

Ответы [ 2 ]

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

Используя grepl :

data$Condition[ grepl("blood pressure", data$Condition) ] <- "3"
data$Condition[ grepl("heart disease",  data$Condition) ] <- "2"
# etc...

Или немного лучший подход, когда есть несколько условий, преобразуйте их в новые строки, тогда мы можем сделать прямое сравнение с использованием == вместо regex match grepl:

res <- data[, list(Condition = unlist(strsplit(Condition, ","))), by = Gene
            ][, Condition := gsub("Name=", "", Condition) ]

res
# Gene                                         Condition
# 1: Gene1               Asymmetrical dimethylarginine level
# 2: Gene1                Bipolar disorder and schizophrenia
# 3: Gene1  3-hydroxypropylmercapturic acid levels in smoker
# 4: Gene2                                    blood pressure
# 5: Gene2                                          diabetes
# 6: Gene3                                     heart disease
# 7: Gene4                           Childhood ear infection
# 8: Gene5                                              <NA>
# 9: Gene6                                    kidney disease
0 голосов
/ 17 февраля 2020

Теперь операция сопоставления может быть представлена ​​как сложное соединение в SQL. Сначала создайте numDF, который представляет собой фрейм данных из двух столбцов с именами для сопоставления в первом столбце и их номерами во втором столбце. Затем выполните соединение.

library(sqldf)

nums <- c("blood pressure" = 3, heart = 2, diabetes = 1, "kidney disease" = 1)
numDF <- data.frame(Name = names(nums), Value = as.vector(nums))

sqldf("select 
    a.Gene, 
    max(case when a.Condition is not Null then coalesce(b.Value, 0.5) end) Condition
  from DF a 
  left join numDF b on a.Condition like '%' || b.Name || '%'
  group by Gene", method = "raw")

давая:

   Gene Condition
1 Gene1       0.5
2 Gene2       3.0
3 Gene3       2.0
4 Gene4       0.5
5 Gene5        NA
6 Gene6       1.0

Примечание

Нельзя использовать dput для объекта с внутренним указателем, поэтому я изменил вывод dput для использования:

DF <-
structure(list(Gene = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5", 
"Gene6"), Condition = c("    Name=Asymmetrical dimethylarginine leve,l Name=Bipolar disorder and schizophrenia, Name=3-hydroxypropylmercapturic acid levels in smoker", 
"    Name=blood pressure, Name=diabetes", "Name=heart disease", 
"Name=Childhood ear infection", NA, "Name=kidney disease")), 
row.names = c(NA, -6L), class = "data.frame")

РЕДАКТИРОВАТЬ

Изменены, чтобы добавить условие макс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...