【问题标题】:lapply 2 functions in one command在一个命令中应用 2 个函数
【发布时间】:2014-06-19 09:23:09
【问题描述】:

我想更改数据框中的一些名称df

> names(df)[17:26]
[1] "X1."  "X2."  "X3."  "X4."  "X5."  "X6."  "X7."  "X8."  "X9."  "X10."

我想要“X”->“Reach”并删除点。 我用过 lapply:

change <- function(d){
    gsub("X","reach",d) 
    gsub("\\.","",d)
}
a <- as.character(lapply(names(df)[17:26], change))

但是“X”没有改变。为什么?

> a 
[1] "X1"  "X2"  "X3"  "X4"  "X5"  "X6"  "X7"  "X8"  "X9"  "X10"

【问题讨论】:

  • 那是因为您没有保存第一次操作的结果。你应该先d &lt;- gsub("X","reach",d) 然后gsub("\\.","",d)
  • 您也可以将两个 gsubs 嵌套在一起:gsub("X","reach", gsub("\\.","",d))
  • beginneR 建议更好。这样您就可以放弃for 循环并使您的解决方案完全矢量化,如a &lt;- gsub("X","reach", gsub("\\.","",names(df)[17:26]))
  • 嗨,在标记之前花点时间阅读标记摘录。 dataframes 用于熊猫,而您需要 data.frame 在这里。下次小心点。请参阅此元帖子。 Warn [r] users from adding [dataframes] tag instead of [data.frame] tag

标签: r dataframe lapply names


【解决方案1】:

您可以使用反向引用(模式表达式的括号部分)在单个 gsub 中执行此操作。

x <- names(df)[17:26]
gsub( "X([0-9]+)." , "Reach\\1" , x )
# [1] "Reach1"  "Reach2"  "Reach3"  "Reach4"  "Reach5"  "Reach6"  "Reach7"  "Reach8"  "Reach9"  "Reach10"

我们使用[0-9]+ 匹配您的姓名向量中的数字,并通过将它们括在括号中,我们将其称为反向引用。我们可以通过反向引用来引用括号内匹配的内容。由于这是第一组括号,它的后向引用是\\1。如果我们有另一组大括号,我们可以将其称为\\2。所以我们匹配X,然后是一些数字,然后是.。我们将其替换为Reach 和括号内匹配的数字,使用\\1 引用反向引用。

我希望这个解释是有道理的!这不是最清楚的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2017-03-06
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多