R - 使用if语句创建新变量

时间:2014-05-09 11:14:08

标签: string r variables if-statement

我正在尝试在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  }

但我不确定我是否正确的方式......请帮忙吗?

3 个答案:

答案 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"