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

ああ、私はこのエラーメッセージが大好きです!! :)

両方[...]右側に同じ条件を設定することで実際に機能することを知っていますが、これを行うためのより良い(よりエレガントで後で読みやすい)方法が必要ですか? var1var2

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)

すべてを1行で実行し、ライブラリを追加してその使用方法を学ぶという複雑さを回避します...何が好きではないのですか?!

于 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 に答える