在R中创建新的条件字符串变量,它是现有字符串变量的paste()

时间:2012-06-08 08:59:18

标签: r conditional-statements

我的R有问题让我发疯了......

我根据报告的数据(清理和验证)设置了很多条件变量,并一直遇到这种情况。它与替换向量的长度和条件语句有关(请原谅我的不良解释......)。

让我举一个例子:

根据报告的数据,我创建了一个“合成”字符变量batch_id,如下所示paste(var1, var2, sep="")。但是,仅当var2长度为6个字符且以“B”结尾时才会显示。

如果var2更短(通常是)或不以“B”结尾,我想要batch_id <- NA(缺少)

我尝试了以下内容:

data <- within(data, batch_id[nchar(data$var2) <6] <- NA)

data <- within(data, batch_id[nchar(data$var2) == 6 & !substr(data$var2, 6, 6) == "B"] <- NA)

data <- within( data, batch_id[nchar(data$var2) == 6 & substr(data$var2, 6, 6) == "B"] <- paste(data$var1, data$var2, sep=""))

但是,在最后一行代码中,我收到错误消息:

number of items to replace is not a multiple of replacement length

哦,我多么喜欢这个错误信息!! :)

我知道通过在 [...]var1的右侧设置相同条件var2它确实有效,但必须有一个这样做的更好(更优雅,更可读)?

3 个答案:

答案 0 :(得分:3)

data$batch_id <- paste(data$var1, data$var2, sep="")

之后,您可以根据自己的条件将值更改为NA。

答案 1 :(得分:1)

我建议:

batch_id = ifelse(grepl("B$",data$var2) & nchar(data$var2)==6, 
                             paste(data$var1, data$var2, sep=""), NA)

一切都在一行,并避免添加额外的库和学习如何使用它们的复杂性...什么是不爱?!

答案 2 :(得分:0)

你可以这样做:

library(stringr)

# generate some dummy data
df <- data.frame(var1=c("a", "b", "c"), var2=c("12345B", "123B", "123456"),stringsAsFactors=F)


df$batch_id <- with(df, ifelse(nchar(var2) == 6 & str_sub(var2, -1) == "B", str_c(var1, var2), NA))