0

我对 R 有一个问题,这让我发疯....

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

让我举一个你的例子:

根据报告的数据,我创建了一个“合成”字符变量batch_id,如下所示paste(var1, var2, sep="")。但是,仅当var26 个字符长且以“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它确实有效,但必须有更好的(稍后更优雅、更易读)的方式来做到这一点?

4

3 回答 3

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

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

于 2012-06-08T09:13:01.027 回答
1

我建议:

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

把所有东西都放在一条线上,避免了添加额外库和学习如何使用它们的复杂性……有什么不喜欢的?!

于 2012-06-08T13:37:17.237 回答
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))
于 2012-06-08T09:46:53.470 回答