Замените неравенства во фрейме данных различными типами элементов в R

#r #dataframe #replace #inequalities

Вопрос:

У меня есть фрейм данных, который включает в себя несколько столбцов, в которых есть много случаев, когда присутствуют неравенства. То, что я хотел бы иметь, — это сценарий R, который определит эти неравенства и заменит их фактическими значениями. Более конкретно, давайте предположим, что у нас есть "<2" , и мы хотим заменить его половиной стоимости ("<2" -> 1.0) . Есть ли общий способ сделать это так, чтобы мне не нужно было вручную находить все неравенства внутри фрейма данных и заменять их?

Простым примером может быть следующее:

 Col1,Col2, Col3, Col4 
3.4, RHO_1, <5, NA 
2,   RHO_2,  5, 1.3
 

И я хочу получить что-то вроде этого:

 Col1,Col2,Col3,Col4 
3.4, RHO_1, 2.5, NA 
2,   RHO_2,  5, 1.3
 

Когда все элементы являются числовыми значениями (например, используйте числовые значения вместо RHO_1, RHO_2 и NA), работает следующая команда:

 df <-  lapply(df, function(x) sapply(sub("<", "0.5*", x, fixed = TRUE),
                                function(y) eval(parse(text = y))))
 

Однако приведенная выше команда не работает при наличии NA строк и (например RHO_1 ).
Я попытался найти расположение элементов, содержащих только значения, после преобразования всех ненулевых значений в NA, используя следующую команду:

 value_ind<- which(!is.na(as.matrix(df)), arr.ind = TRUE, useNames = TRUE) 
 

но мне не удалось успешно использовать эту информацию.
К вашему сведению, фактический df фрейм данных состоит из множества строк и столбцов.

Ответ №1:

Мне удалось устранить эту проблему. Я получил подмножество исходного кадра данных (здесь названного dataBase2), чтобы он не включал символы (например, исключил RHO_1,). Сокращенный кадр данных называется dataBase6. Затем я преобразовал другие символы (например,» -«, » _ » и т. Д.) В NA, а затем применил функцию. Ниже я даю код из фактического набора данных:

 # names of the columns that I want to remove (contain character)
out <- c("Code-Medsal","Number","Code_National","Projection","date","Notes") 
dataBase6 <- dataBase2[, !(colnames(dataBase2) %in% out) ] 
#replace special symbols with NA
dataBase6[dataBase6=="-"] <- NA
#apply the function to the numeric values   NA
dataBase6[] <-  lapply(dataBase6, function(x) sapply(sub("<", "0.55*", x, fixed = TRUE),
                                  function(y) eval(parse(text = y))))