Применение пользовательской функции к данным из выбранных столбцов, если условие выполняется с использованием apply и mutate_at - PullRequest
2 голосов
/ 25 сентября 2019

Я пытаюсь добавить символ в начало выбранных столбцов (те, которые заканчиваются на "c") кадра данных, которые являются числовыми, а не пустыми / NA.Я подхожу к этому, используя mutate_at, чтобы выбрать определенные столбцы и paste0, чтобы добавить символ в начало строки, но я сталкиваюсь с проблемами, так как он будет в качестве символа для каждой ячейки, даже если ее пустое / NA:

appendCoeff <- function(x) {ifelse(is.numeric(x), paste0("a", x) , x)} 
#appendCoeff <- function(x) paste0("a", x)
df2 <- df2 %>% mutate_at(vars(ends_with("c")), appendCoeff)

Мой вопрос: нужно ли включать lapply с is.numeric в качестве альтернативы?Данные ниже для первых 15 строк:

> dput(head(df2,10))
structure(list(Reaction = c("k1", "k2", "k3", "k2", "k3", "k4", 
"k5", "k6", "k7", "k8"), R1c = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1
), R1 = c("HOCl", "OCl-", "NH2Cl", "NHCl2", "H2O2", "HO2-", "NH2Cl", 
"NH2Cl", "NH2Cl", "NHCl2"), R2c = c("", "", "", "", "", "", "1", 
"1", "1", "1"), R2 = c("", "", "", "", "", "", "$OH", "$Cl", 
"$Cl2-", "$OH"), R3c = c("", "", "", "", "", "", "", "", "", 
""), R3 = c("", "", "", "", "", "", "", "", "", ""), P1c = c("1", 
"1", "1", "1", "2", "1", "1", "1", "1", "1"), P1 = c("$OH", "O$-", 
"$NH2", "$NHCl", "$OH", "$OH", "$NHCl", "$NHCl", "$NHCl", "NCl2$"
), P2c = c("1", "1", "1", "1", "", "1", "1", "1", "2", "1"), 
    P2 = c("$Cl", "$Cl", "$Cl", "$Cl", "", "O$-", "OH-", "Cl-", 
    "Cl-", "H2O"), P3c = c("", "", "", "", "", "", "", "", "1", 
    ""), P3 = c("", "", "", "", "", "", "", "", "H+", "")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

1 Ответ

2 голосов
/ 25 сентября 2019

Проблема с is.numeric заключается в том, что большинство столбцов относятся к классу character, за исключением одного из них с 'R1c'.Таким образом, если мы используем is.numeric для столбца character, он вернет FALSE.Вместо этого мы можем проверить, имеют ли элементы только цифры ([0-9.]+) от начала (^) до конца ($) строки.Более простой вариант - !is.na(as.numeric(.)), т. Е. Когда мы используем as.numeric, он преобразует действительные числовые значения в числовые, в то время как нечисловые значения будут NA, а затем мы создаем логику с is.na (но с предупреждением)

library(dplyr)
libray(stringr)
df2 %>%
    mutate_at(vars(ends_with("c")), ~ case_when(str_detect(., "^[0-9]+$") ~
               str_c("a", .), TRUE ~ as.character(.)))
...