0

我有一个如下所示的 data.table:

require(data.table)
require(stringi)

DT <- data.table(ID = c(1,2,3), Name =c("john peter", "joe", "Ann cathrine"))

我想操作 Name 列,以便将名称的第一个字符和中间名也放在上面:

data.table(ID = c(1,2,3), Name =c("John Peter", "Joe", "Ann Cathrine"))

我的方法如下:

  • 使用“”作为分隔符拆分名称字符串
  • 由 split 产生的列表中每个元素的上位第一个字符
  • 使用 paste with collapse 将操作的列表元素粘贴在一起。

我尝试了这两种方法do.calllapply使用用户定义的函数toUpperFirst

DT[,  NameCapFirstTry   := paste0(do.call(toUpperFirst, stri_split_fixed(Name," ")), collapse = ' ')]

DT[,  NameCapSecondTry  := paste0(lapply(stri_split_fixed(Name," "),  toUpperFirst), collapse = ' ')]

toUpperFirst <- function (x){
  return (paste0(toupper(substring(x,1,1)), tolower(substring(x,2))))
}

我不太明白出了什么问题。显然,拆分采用整个列,而不是按向量方式应用它。知道如何解决这个问题吗?

4

0 回答 0