繁体   English   中英

R中合并后合并列的功能

[英]Function to combine columns after a merge in R

我想合并两个数据框后合并列。 现在,我正在编写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)

任何帮助,将不胜感激

有望这样做。 (请注意,由于没有示例数据,因此尚未经过测试)

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

为了避免交换列的这一步骤,您可以通过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)如果我们有很多,那么我们可能想使用一个辅助函数,该函数利用gsubfn包中的fn$来实现准Perl样式的字符串替换:

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主页

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM