根据条件列名称子集数据帧

时间:2017-08-26 08:02:36

标签: r

我尝试根据列的值来对数据帧进行子集,该列可以在不同版本的数据帧上更改名称。我要测试的值是" ----"在名为" 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")])

2 个答案:

答案 0 :(得分: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")]
      }

最后,在阅读了William Ashford的回答之后,下面的单行将完全按照你的要求行事。只需使用有问题的列始终是第二个的事实。

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

归功于他。

答案 1 :(得分:0)

How to drop columns by name in a data frame

所示

将您的数据框设置为子集,

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

这是一个非常容易找到答案的答案,我建议你在发布问题之前先看看。