2017-08-26 112 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

相關問題