2016-04-08 37 views
-1

我已阅读以下与我的问题类似(但仍然不同)的问题:R如何根据另一个表中的列顺序查找并重新排列一个表中的列(表中包含不同列数的列)

  1. Order data frame rows according to a target vector that specifies the desired order
  2. How to reorder data.table columns (without copying)

我的问题是不同的,因为在线程1,这两个表具有相同的长度,我试图使用线程2所示的方法,但好像他们也必须是相同的长度。

出于说明目的,我将创建两个表如下:

table1 = data.frame(rbind(c(rep(c(TRUE,FALSE), 3)), c(rep(TRUE, 4), rep(FALSE, 2)))) 
dim(table1) 
setnames(table1, letters[1:6]) 
table1 
    a  b c  d  e  f 
1 TRUE FALSE TRUE FALSE TRUE FALSE 
2 TRUE TRUE TRUE TRUE FALSE FALSE 

table2 = data.frame(rbind(c(rep(c(TRUE,FALSE), 2)), c(rep(TRUE, 3), rep(FALSE, 1)))) 
dim(table2) 
setnames(table2, letters[7:4]) 
table2 
    g  f e  d 
1 TRUE FALSE TRUE FALSE 
2 TRUE TRUE TRUE FALSE 

所需的返回将是:

f  e  d 
1 FALSE TRUE FALSE 
2 FALSE FALSE TRUE 

返回表将适合以下标准:

  1. 只包含两个表中的字母
  2. 顺序返回表是表的顺序一致2

基本上,我想清理我的表1只包含列名也存在于表2,我想重新排序的表1的列顺序与表2列相同。

让我知道是否需要澄清其他东西!谢谢!

+1

f呢? 'table1 [intersect(names(table2),names(table1))]'?你使用的是什么软件包,'setnames'来自哪里 – rawr

+0

为什么列f被排除在期望的输出之外? – FascinatingFingers

+0

@FascinatingFingers好抓!我的错!将修复我现在的错误 – alwaysaskingquestions

回答

0

安装并加载dplyr包为select功能。使用的其他功能matchorderis.nawhich和运营商%in%

install.packages("plyr") 
    install.packages("dplyr") 
    library(plyr) 
    library(dplyr) 

    table1 = data.frame(rbind(c(rep(c(TRUE,FALSE), 3)), c(rep(TRUE, 4), rep(FALSE, 2)))) 
    dim(table1) 
    names(table1) <- letters[1:6] 

    table2 = data.frame(rbind(c(rep(c(TRUE,FALSE), 2)), c(rep(TRUE, 3), rep(FALSE, 1)))) 
    dim(table2) 
    names(table2) <- letters[7:4] 

    target <- as.vector(names(table2)) 
    t <- select(table1, which(names(table1) %in% target)) 
    gg <- match (target,names(t)) 
    gg <- gg[!is.na(gg)] 
    Result <- t[,order(gg)] 
    Result 
+0

啊谢谢你Sowmya!我使用了你的方法的变体,但基本的想法/步骤是相同的​​。谢谢! – alwaysaskingquestions

+0

你能否在这里粘贴你的版本,以便我也可以学习。谢谢。 –

+0

嗨Sowmya,绝对。我会在几分钟内打出答案 – alwaysaskingquestions

1

感谢Sowmya与我分享想法。根据请求,以下是我根据从Sowmya的回答和rawr的评论中学到的答案的答案。

table1 = data.frame(rbind(c(rep(c(TRUE,FALSE), 3)), c(rep(TRUE, 4), rep(FALSE, 2)))) 
dim(table1) 
setnames(table1, letters[1:6]) 

table2 = data.frame(rbind(c(rep(c(TRUE,FALSE), 2)), c(rep(TRUE, 3), rep(FALSE, 1)))) 
dim(table2) 
setnames(table2, letters[7:4]) 

# below are my answer 
col2keep = intersect(colnames(table2), colnames(table1)) 
table1_reduce = table1[, (match(col2keep, colnames(table1)))] 

和table1_reduce将包含我所需的输出。

相关问题