【问题标题】:Applying a custom function to data from select columns if condition is met using apply and mutate_at如果使用 apply 和 mutate_at 满足条件,则将自定义函数应用于选择列中的数据
【发布时间】:2020-01-26 01:47:54
【问题描述】:

我正在尝试将一个字符添加到数据帧的选择列(以“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)

我的问题是我是否需要将lapplyis.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"))

【问题讨论】:

  • 列值。我偶然使用rename 对列名进行了处理

标签: r function apply dplyr


【解决方案1】:

is.numeric 的问题是大多数列都是character 类,除了其中一个带有“R1c”。因此,如果我们在character 列上使用is.numeric,它将返回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(.)))

【讨论】:

  • 感谢您的回复!成功的!你能解释一下“。”在mutate 中的str_detectas.character 函数中工作,所以我可以学会更好地使用它?
  • @jbearazesh 使用~,它充当您创建的匿名函数function(x) 这里,默认情况下,x.,即该列的值。 case_when 对类型非常讲究。它不能将一种类型与另一种混合。如果您检查第一个第一个R1c 列,它是double,而其他的是character。因此,要使其成为相同的类型,否则它会失败,我们必须将列更改为 characteras.character
  • @jbearazesh 是否需要将 'R1c' 和 'Jan'、'R2c' 的列名更改为 'feb' 等?
  • 当然我会发布一个新问题并在此处链接
  • 提出了新问题。它冗长,我只是在我的方法中寻求帮助,这样我才能理解如何更好地解决这个问题。然而,如果不解释全貌,就很难传达最终目标。请看:stackoverflow.com/questions/58107163/…
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 2019-10-12
  • 2017-04-30
  • 2011-10-16
  • 2020-06-27
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
相关资源
最近更新 更多