我的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
它确实有效,但必须有一个这样做的更好(更优雅,更可读)?
答案 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))