-1

2 つのデータフレームを結合した後、列を結合したいと考えています。現在、変数ごとに統一された列を取得する ifelse ステートメントを作成しています。他の列を上書きするデータ フレーム (つまり x) を選択する関数が必要です。

df$source<-ifelse(df$source.x=='',df$source.y,df$source.x)
df$id<-ifelse(df$id.x=='',df$id.y,df$id.x)
df$profile_url<-ifelse(df$profile_url.x=='',df$profile_url.y,df$profile_url.x)

どんな助けでもいただければ幸いです

4

2 に答える 2

3

これでうまくいくはずです。(注、サンプルデータがないためテストされていません)

fixedColumn <- function(colm, myDF, keepx=TRUE) { 
  x <- myDF[[paste0(colm, ".x")]]
  y <- myDF[[paste0(colm, ".y")]]

  if(keepx)
    return(ifelse(x=='', y, x))
  # else  
  ifelse(y=='', x, y)
}

# columns that need fixing.  Don't include the suffixes
cols <- c("source", "id", "url")

# fix the .x columns
df[, paste0(cols, ".x")]  <- sapply(cols, fixedColumn, df)

# delete the .y columns
for (cc in paste0(cols, ".y"))
  df[[cc]] <- NULL

@agstudy のサンプル データの使用:

> df
  Row.names id.x source.x url.x
1         1    2        2     3
2         2    3        1     3
3         3    3        1     2
4         4    3        2     2
5         5    3        2     2
于 2013-02-24T06:32:20.667 に答える
2

列を交換するこの手順を回避するには、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 のホームページを参照してください

于 2013-02-24T07:36:46.553 に答える