列を交換するこの手順を回避するには、sqldf
パッケージ経由で SQL を使用して列を交換できます (実際の問題が同時に実行できるマージに関係している場合)。CASE
...構文を使用しWHEN
て、同じ if/else ロジックを記述します。
library(sqldf)
colnames(df) <- gsub('[.]','_',colnames(df))
sqldf(" SELECT
CASE url_x WHEN '' THEN url_y ELSE url_x END as url ,
CASE source_x WHEN '' THEN source_y ELSE source_x END as source,
CASE id_x WHEN '' THEN id_y ELSE id_x END as id
FROM df")
再現可能な例
再現可能な例でテストします。
# create some data
set.seed(1234)
df1 <- matrix(sample(c('a','b','d',''),3*5,rep=T),ncol=3)
df2 <- matrix(sample(c('c','b','','a'),3*5,rep=T),ncol=3)
colnames(df1) <- c('id','source','url')
colnames(df2) <- c('id','source','url')
df <- merge(df1,df2,by=0)
# run
library(sqldf)
colnames(df) <- gsub('[.]','_',colnames(df))
sqldf(" SELECT
CASE url_x WHEN '' THEN url_y ELSE url_x END as url ,
CASE source_x WHEN '' THEN source_y ELSE source_x END as source,
CASE id_x WHEN '' THEN id_y ELSE id_x END as id
FROM df")
url source id
1 d d a
2 d a d
3 b a d
4 a d d
5 b d c
はどこdf
ですか:
Row_names id_x source_x url_x id_y source_y url_y
1 1 a d d a b a
2 2 d a d b b
3 3 d a b b c a
4 4 d d c c a
5 5 d b c c c
ヘルパー関数の使用
(1)fn$
これらが多数ある場合は、準 perl スタイルの文字列置換を実装する gsubfn パッケージを利用するヘルパー関数を使用することをお勧めします。
xy <- function(s) {
fn$identity("case $s_x when '' then $s_y else $s_x end as $s")
}
fn$sqldf("select `xy('url')`, `xy('source')`, `xy('id')` from df")
(2)またはこの方法で実行します-SQLステートメントを次の場所に保存しますs
:
s <- fn$identity("select `xy('url')`, `xy('source')`, `xy('id')` from df")
sqldf(s)
より詳しい情報
sqldf のホームページを参照fn$
してください。gsubfn のホームページを参照してください。