2017-08-26 74 views
0

我想根据可以更改名称在不同版本的数据框上的列的值的子集数据框。我想要测试的值是“----”,名称是“SIC”或“NAICS”。根据条件列名称的子集数据框

版本1:

df 
    MSA SIC EMPFLAG EMP 
1 40 ----   43372 
2 40 07--   192 
3 40 0700   192 

版本2:

df 
    MSA NAICS EMPFLAG EMP 
1 40 ----   78945 
2 40 07--   221 
3 40 0700   221 

的预期结果是:

版本1:

df 
    MSA EMP 
1 40 43372 

版本2:

df 
    MSA EMP 
1 40 78945 

下面的代码不起作用:

df <- ifelse("SIC" %in% colnames(df), 
      df[df$SIC=="----", c("MSA", "EMP")], 
      df[df$NAICS=="----", c("MSA", "EMP")]) 

回答

1

与您的代码的问题是使用量化ifelse的时候,你并不真的需要它。

df <- if(any(grepl("SIC", colnames(df)))) { 
     df[df$SIC=="----", c("MSA", "EMP")] 
     } else { 
     df[df$NAICS=="----", c("MSA", "EMP")] 
     } 
df 

请注意,您还可以使用%in%,这可能是简单的。

df <- if(any("SIC" %in% colnames(df))){ 
     df[df$SIC=="----", c("MSA", "EMP")] 
     } else { 
     df[df$NAICS=="----", c("MSA", "EMP")] 
     } 

最后,在阅读威廉·阿什福德的答案后,下面的一行代码将完全按照你的要求进行。只要使用问题列始终是第二个的事实。

df <- df[df[, 2] == "----",-which(names(df) %in% c('SIC','NAICS','EMPFLAG'))] 

这个信用给他。

0

正如How to drop columns by name in a data frame

子集看到你的数据帧,使得

df = df[,-which(names(df) %in% c('SIC','NAICS'))] 

这是一个非常简单的答案,找那么不妨建议你采取通过SO发布问题之前,一起来看看。

+0

@WilliamAshford删除列仅次于我试图实现的目标。在删除它之前,我需要在列中测试一个值。 – syre

+0

好的,这是在原文后添加的,但我会尽力修改答案以使其可行。 – Will

+0

无视我无法在Rui Barradas的答案的简单性上做出重大贡献。 – Will