【问题标题】:R gsub doesn't work with applyR gsub 不适用于应用
【发布时间】:2018-09-10 21:22:19
【问题描述】:

我有以下代码行,它采用“_”字符后的所有字符串:

gsub(" ","",unlist(strsplit(dtt$id,"[,_]")))[2]

它工作正常。但是,当我尝试将其放入应用函数以便对 dtt 表中的所有 id 执行相同操作时,我收到以下错误:

apply(dtt,1,gsub(" ","",unlist(strsplit(dtt$id,"[,_]")))[2])

get(as.character(FUN), mode = "function", envir = envir) 中的错误

dtt:

身份证等级

1_蒂姆 89

2_杰克 100

3_杰夫 55

【问题讨论】:

  • 这与gsub无关;你没有正确使用applyapply 的第三个 FUN 参数必须是应用于 data.frameMARGIN 之一的 function。如果您提供一些示例数据,则更容易举例。
  • gsub 不是一个函数吗?我在原帖中添加了一个 dtt 表的示例。
  • gsub是一个函数;但FUN 需要是您对应的MARGIN 的函数。请参阅下面的答案。

标签: r error-handling apply sapply


【解决方案1】:

这就是你所追求的吗?

# Sample data
dtt <- read.table(text =
    "id grade
1_Tim 89
2_Jack 100
3_Jeff 55", header = T)

apply(dtt, 1, function(x) gsub(" ","", unlist(strsplit(x, "[,_]")))[2])
#[1] "Tim"  "Jack" "Jeff"

这里实际上不需要apply。你可以这样做:

gsub("\\d+_", "", dtt$id)
#[1] "Tim"  "Jack" "Jeff"

或者,如果您想清理您的 dtt 中的 id 条目:

transform(dtt, id = gsub("\\d+_", "", id));
#    id grade
#1  Tim    89
#2 Jack   100
#3 Jeff    55

【讨论】:

  • 确实有效!至于申请——我觉得很奇怪,我需要在写到同一行之前声明一个函数。想知道它背后的逻辑是什么?
  • @Mark2Bra 一般没有什么奇怪的; FUNMARGIN 的函数。因此,您定义了一个将行 (MARGIN=1) 或列向量 (MARGIN=2) 作为参数的函数。在您的情况下,正如我所演示的,实际上不需要使用 applygsub 已经矢量化,因此您可以简单地将列向量作为 x 参数传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
相关资源
最近更新 更多