#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))))