【问题标题】:Function not running over all objects in the vector? (R)函数没有在向量中的所有对象上运行? (右)
【发布时间】:2016-03-05 21:55:53
【问题描述】:

我编写了以下函数来将全名更改为首字母后跟姓氏:

names1 <- function(x) {
            z <- unlist(strsplit(x, " "))[1]
            z <- substr(z,1,1)
            y <- unlist(strsplit(x, " "))[2]
            paste(z,"."," ", y, sep="")
           }

所以

name <- "John Doe"
names1(name)

成功返回

"J. Doe"

但是,当我尝试将其应用于名称向量时,它只返回第一个对象(格式正确)。

为什么它不会在向量中的所有对象上执行该功能?我确实发现使用sapply 可以正常工作,但是我可以在没有sapply 的向量上运行其他类型的函数,并将完整的向量作为输出返回。

【问题讨论】:

  • 您使用[1][2] 硬编码了unlist(strsplit(...)) 的第一个和第二个元素。您必须更改函数以获取每个名字和每个姓氏,或者您可以将其保持为非矢量化并使用 Frank 回答中的建议。

标签: r function


【解决方案1】:

data.table 包中的tstrsplit 使这更加简单:

n = c("John Doe", "Abigail Ames")

library(data.table)
x = tstrsplit(n, " ")
paste0(substr(x[[1]],1,1), ". ", x[[2]])
# [1] "J. Doe"  "A. Ames"

或者,在基础中,您可以在函数上使用Vectorize 来制作矢量化版本:

Vectorize(names1)(n)
#     John Doe Abigail Ames 
#     "J. Doe"    "A. Ames"

或者使用sapply将函数应用于每个元素,然后合并结果

sapply(n, names1)
#     John Doe Abigail Ames 
#     "J. Doe"    "A. Ames" 

【讨论】:

  • 谢谢!我经常环顾四周,发现 data.table 包,一旦我在基础上感到足够舒适,就会去检查它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2014-06-23
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多