我正在尝试在if
语句下的数据表中创建一个新变量:如果string变量包含substring,则new变量等于数值。
我的数据:
N X
1 aa1aa
2 bb2bb
3 cc-1bb
...
Dataframe包含数千行。
需要的结果是包含数字值的新列,其中包含字符串(X collumn):
N X Y
1 aa1aa 1
2 bb2bb 2
3 cc-1bb -1
我正在尝试
for (i in 1:length(mydata)){
if (grep('1', mydata$X) == TRUE) {
mydata$Y <- 1 }
但我不确定我是否正确的方式......请帮忙吗?
答案 0 :(得分:0)
这样的事情?
d <- data.frame(N = 1:3,
X = c('aa1aa', 'bb2bb', 'cc-1bb'),
stringsAsFactors = FALSE)
library(stringr)
d$Y <- as.numeric(str_extract_all(d$X,"\\(?[0-9,.]+\\)?"))
d
N X Y
1 1 aa1aa 1
2 2 bb2bb 2
3 3 cc-1bb 1
编辑 - 速度测试
@Simon 提供的gsub approch比stringr快得多
library(microbenchmark)
# 30000 lines data.frame
d1 <- data.frame(N = 1:30000,
X = rep(c('aa1aa', 'bb2bb', 'cc-1bb'), 10000),
stringsAsFactors = FALSE)
stringr
microbenchmark(as.numeric(str_extract_all(d1$X,"\\(?[0-9,.]+\\)?")),
times = 10L)
Unit: seconds
expr min lq median uq max neval
as.numeric(str_extract_all(d1$X, "\\\\(?[0-9,.]+\\\\)?")) 2.677408 2.75283 2.76473 2.781083 2.796648 10
base gsub
microbenchmark(gsub( "[^0-9]" , "" , d1$X ), times = 10L)
Unit: milliseconds
expr min lq median uq max neval
gsub("[^0-9]", "", d1$X) 44.95564 45.05358 45.07238 45.10201 45.23645 10
答案 1 :(得分:0)
使用 @Paulo 中的示例数据,您可以使用gsub
R中的base
...
d$Y <- gsub( "[^0-9]" , "" , d$X )
答案 2 :(得分:0)
这应该适用于更多的扩展样本。基本上它取出了所有不是来自字符串中间的字母。
X <- c("aa1aa", "bb2bb", "cc-1bb","aa+0.5b","fg-0.25h")
gsub("^[a-z]+([^a-z]*)[a-z]+$","\\1",X,perl=T)
#[1] "1" "2" "-1" "+0.5" "-0.25"