部署函数以将字符串转换为R向量

时间:2016-03-12 13:55:01

标签: r dataframe

我有一个R形式的数据框:

column
"[22, 55]"
"[99, 100]"
"[100, 49]"

目标:

column
c(22, 55)
c(99, 100)
c(100, 49)

这个功能可以做到

to_numeric_cols <- function(string){
  to_return <- substring(string, 2, nchar(string) - 1)
  to_return <- c(strsplit(to_return, ",")[[1]])
  to_return <- list(as.numeric(to_return))
  return(to_return)
}

并且通过for循环部署时可以正常工作

即,

for (i in 1:nrow(df)){
   df[["column"]][i] <- to_numeric_cols(df[["column"]][i])
}

然而,这是R,因此这个解决方案肯定会(并且!)非常慢。

我试过了:

df[["column"]] <- apply(df[,c('column'), drop = F], 1, function(x) to_numeric_cols(x))

但是,这会返回表单的行: list(c(22, 55))

我知道申请(至少在我使用它时)并不合适。 我怎样才能以R-thonic方式实现这一目标?

结构:

nm <- c(   "[22, 55]"
         , "[99, 100]"
         , "[100, 49]")
df <- data.frame(nm)

1 个答案:

答案 0 :(得分:2)

这是base-R中的一种方法,它可以处理多个数字并创建一列数字向量。我们使用矢量化方法来清理我们的数据并进行拆分。不幸的是,as.numeric不能这样做所以我们用lapply包装它。

nm <- c(   "[22, 55]"
           , "[99, 100]"
           , "[100, 49]"
           , "[100, 49, 48]")
df <- data.frame(column=nm,stringsAsFactors = F)

首先,我们清理数据并删除括号

df$c2 <- gsub("\\[|\\]","",df$column)

然后我们strsplit(矢量化)和as.numeric(遗憾的是更少矢量化):

df$c3 <- lapply(strsplit(df$c2,","),as.numeric)

(可以一步完成:df$c3 <- lapply(strsplit(gsub("\\[|\\]","",df$column),","), as.numeric)

> str(df)
'data.frame':   4 obs. of  3 variables:
 $ column: chr  "[22, 55]" "[99, 100]" "[100, 49]" "[100, 49, 48]"
 $ c2    : chr  "22, 55" "99, 100" "100, 49" "100, 49, 48"
 $ c3    :List of 4
  ..$ : num  22 55
  ..$ : num  99 100
  ..$ : num  100 49
  ..$ : num  100 49 48