我有一个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)
答案 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