删除r中的废话列

时间:2014-06-04 08:22:46

标签: r

我有这个数据

vector <- c("Pos_emaO_dO_UP", "Pos_emaO_dO_D", "Pos_emaC_dC_UP", "Pos_emaC_dC_D",
            "Pos_emaC_dO_D", "Pos_emaC_dO_UP", "Pos_emaO_dC_UP", "Pos_emaO_dC_D")

和这个功能

comb <- as.data.frame(combn(vector, 4))
comb

给了我这张表

V1             V2             V3             V4             V5             V6             V7             V8             V9            V10            V11            V12
1 Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP
2  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D
3 Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dO_D  Pos_emaC_dO_D  Pos_emaC_dO_D
4  Pos_emaC_dC_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dC_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dC_D
             V13            V14            V15            V16            V17            V18            V19            V20            V21            V22            V23            V24
1 Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP
2  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP
3 Pos_emaC_dO_UP Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dO_D  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dO_UP
4 Pos_emaO_dC_UP  Pos_emaO_dC_D  Pos_emaO_dC_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D
             V25            V26            V27            V28            V29            V30            V31            V32            V33            V34            V35            V36
1 Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP  Pos_emaO_dO_D
2 Pos_emaC_dC_UP  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dO_D  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dC_UP
3 Pos_emaO_dC_UP  Pos_emaC_dO_D  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dO_UP Pos_emaO_dC_UP Pos_emaC_dO_UP Pos_emaC_dO_UP Pos_emaO_dC_UP Pos_emaO_dC_UP  Pos_emaC_dC_D
4  Pos_emaO_dC_D Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D  Pos_emaO_dC_D  Pos_emaO_dC_D  Pos_emaC_dO_D
             V37            V38            V39            V40            V41            V42            V43            V44            V45            V46            V47           V48
1  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D Pos_emaO_dO_D
2 Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP  Pos_emaC_dC_D  Pos_emaC_dC_D Pos_emaC_dC_D
3  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dO_D  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_D
4 Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D  Pos_emaO_dC_D Pos_emaC_dO_UP Pos_emaO_dC_UP Pos_emaO_dC_D
             V49            V50            V51            V52            V53            V54            V55            V56            V57            V58            V59            V60
1  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP
2  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dO_D  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D
3 Pos_emaC_dO_UP Pos_emaC_dO_UP Pos_emaO_dC_UP Pos_emaC_dO_UP Pos_emaC_dO_UP Pos_emaO_dC_UP Pos_emaO_dC_UP  Pos_emaC_dO_D  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dO_UP
4 Pos_emaO_dC_UP  Pos_emaO_dC_D  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D  Pos_emaO_dC_D  Pos_emaO_dC_D Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D
             V61            V62            V63            V64            V65            V66            V67            V68            V69            V70
1 Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dO_D
2  Pos_emaC_dC_D  Pos_emaC_dO_D  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP  Pos_emaC_dO_D  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dO_UP
3 Pos_emaO_dC_UP Pos_emaC_dO_UP Pos_emaC_dO_UP Pos_emaO_dC_UP Pos_emaO_dC_UP Pos_emaC_dO_UP Pos_emaC_dO_UP Pos_emaO_dC_UP Pos_emaO_dC_UP Pos_emaO_dC_UP
4  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D  Pos_emaO_dC_D  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D  Pos_emaO_dC_D  Pos_emaO_dC_D  Pos_emaO_dC_D
> 

我需要在一列中删除这些具有相同名称(在_UP_D之前)的列。这意味着,例如,删除V1:V20(两次始终使用相同的名称),我需要的第一列是V21

我有庞大的数据集,这只是一个例子,任何建议怎么做?感谢

3 个答案:

答案 0 :(得分:1)

要省略具有重复字符串词干的列,您可以执行以下操作,使用逻辑向量对数据框进行子集,该逻辑向量是通过检查每列是否存在字符串词干的重复而生成的:

comb[!sapply(comb, function(x) any(duplicated(sub('_D|_UP', '', x))))]

#              V21            V22            V23            V24
# 1 Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP
# 2 Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP
# 3  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dO_UP
# 4 Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D
#              V27            V28            V29            V30
# 1 Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP Pos_emaO_dO_UP
# 2  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D
# 3  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dO_UP
# 4 Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D
#              V41            V42            V43            V44
# 1  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D
# 2 Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP Pos_emaC_dC_UP
# 3  Pos_emaC_dO_D  Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dO_UP
# 4 Pos_emaO_dC_UP  Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D
#              V47           V48            V49            V50
# 1  Pos_emaO_dO_D Pos_emaO_dO_D  Pos_emaO_dO_D  Pos_emaO_dO_D
# 2  Pos_emaC_dC_D Pos_emaC_dC_D  Pos_emaC_dC_D  Pos_emaC_dC_D
# 3  Pos_emaC_dO_D Pos_emaC_dO_D Pos_emaC_dO_UP Pos_emaC_dO_UP
# 4 Pos_emaO_dC_UP Pos_emaO_dC_D Pos_emaO_dC_UP  Pos_emaO_dC_D

答案 1 :(得分:0)

这是你的想法吗?我的理解是,对于Pos_emaC_dCPos_emaC_dOPos_emaO_dCPos_emaO_dO中的每一个,您需要*_UP*_D,而不是两者。下面,我根据元素所属的这四对中的哪一对来分割矢量。然后,我们可以使用expand.grid创建我们的组合,只从每个组中选择一个元素。

expand.grid(split(vector, sub('_D|_UP', '', vector)))

#       Pos_emaC_dC    Pos_emaC_dO    Pos_emaO_dC    Pos_emaO_dO
# 1  Pos_emaC_dC_UP  Pos_emaC_dO_D Pos_emaO_dC_UP Pos_emaO_dO_UP
# 2   Pos_emaC_dC_D  Pos_emaC_dO_D Pos_emaO_dC_UP Pos_emaO_dO_UP
# 3  Pos_emaC_dC_UP Pos_emaC_dO_UP Pos_emaO_dC_UP Pos_emaO_dO_UP
# 4   Pos_emaC_dC_D Pos_emaC_dO_UP Pos_emaO_dC_UP Pos_emaO_dO_UP
# 5  Pos_emaC_dC_UP  Pos_emaC_dO_D  Pos_emaO_dC_D Pos_emaO_dO_UP
# 6   Pos_emaC_dC_D  Pos_emaC_dO_D  Pos_emaO_dC_D Pos_emaO_dO_UP
# 7  Pos_emaC_dC_UP Pos_emaC_dO_UP  Pos_emaO_dC_D Pos_emaO_dO_UP
# 8   Pos_emaC_dC_D Pos_emaC_dO_UP  Pos_emaO_dC_D Pos_emaO_dO_UP
# 9  Pos_emaC_dC_UP  Pos_emaC_dO_D Pos_emaO_dC_UP  Pos_emaO_dO_D
# 10  Pos_emaC_dC_D  Pos_emaC_dO_D Pos_emaO_dC_UP  Pos_emaO_dO_D
# 11 Pos_emaC_dC_UP Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dO_D
# 12  Pos_emaC_dC_D Pos_emaC_dO_UP Pos_emaO_dC_UP  Pos_emaO_dO_D
# 13 Pos_emaC_dC_UP  Pos_emaC_dO_D  Pos_emaO_dC_D  Pos_emaO_dO_D
# 14  Pos_emaC_dC_D  Pos_emaC_dO_D  Pos_emaO_dC_D  Pos_emaO_dO_D
# 15 Pos_emaC_dC_UP Pos_emaC_dO_UP  Pos_emaO_dC_D  Pos_emaO_dO_D
# 16  Pos_emaC_dC_D Pos_emaC_dO_UP  Pos_emaO_dC_D  Pos_emaO_dO_D

答案 2 :(得分:0)

编辑:我找到了解决方案: 我编写了这个函数,让它运行得很好,它可以工作。

subf<-function (x){
  rc<-allcombin[[x]][!sapply(allcombin[[x]], function(x) any(duplicated(sub('_D|_UP', '', x))))]
  return(rc)
}
lists<-c(1:length(allcombin))
rc_all<-lapply(lists,subf)

我一直在处理@agstudy和@jbaums向我展示的代码 源向量在这里

vrvector<-c("Pos_emaO_dO_UP","Pos_emaO_dO_D","Pos_emaC_dC_UP","Pos_emaC_dC_D","Pos_emaC_dO_D","Pos_emaC_dO_UP","Pos_emaO_dC_UP","Pos_emaO_dC_D")

library(combinat)

rc<-comb[!sapply(comb, function(x) any(duplicated(sub('_D|_UP', '', x))))]

但这是为了与一个df一起工作,如下面的例子

comb<-as.data.frame(combn(vrvector,4))
rc<-comb[!sapply(comb, function(x) any(duplicated(sub('_D|_UP', '', x))))]

但现在我发现这段代码不适用于我需要的列表。所以,如果我使用下面的功能

    allcomb<-function (x){
      combinations<-as.data.frame(combn(vrvector,x))
      return(combinations)
    }
    vcomb<-c(2:(length(vrvector)/2))
    allcombin<-lapply(vcomb,allcomb)
    allcombin

并获取df以获取列出的所有可能数量的变量并使用此类函数

rc<-allcombin[!sapply(allcombin, function(x) any(duplicated(sub('_D|_UP', '', x))))]

结果是

list()

代码更改的所有建议是否适用于列表中的所有df以及单个df?感谢