Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据条件列名子集dataframe_R - Fatal编程技术网

根据条件列名子集dataframe

根据条件列名子集dataframe,r,R,我试图根据一列的值来子集一个数据帧,该列可以在数据帧的不同版本中更改名称。我要测试的值在名为“SIC”或“NAICS”的列中为“----” 第1版: df MSA SIC EMPFLAG EMP 1 40 ---- 43372 2 40 07-- 192 3 40 0700 192 df MSA EMP 1 40 43372 第2版: df MSA NAICS EMPFLAG EMP 1 40 --

我试图根据一列的值来子集一个数据帧,该列可以在数据帧的不同版本中更改名称。我要测试的值在名为“SIC”或“NAICS”的列中为“----”

第1版:

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

df
  MSA NAICS EMPFLAG   EMP
1  40  ----         78945
2  40  07--           221
3  40  0700           221
df
  MSA   EMP
1  40 78945
预期结果是:

第1版:

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

df
  MSA NAICS EMPFLAG   EMP
1  40  ----         78945
2  40  07--           221
3  40  0700           221
df
  MSA   EMP
1  40 78945
以下代码不起作用:

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

df您的代码的问题是在您不真正需要时使用矢量化的
ifelse

df <- if(any(grepl("SIC", colnames(df)))) {
         df[df$SIC=="----", c("MSA", "EMP")]
      } else {
         df[df$NAICS=="----", c("MSA", "EMP")]
      }
df
最后,在阅读了William Ashford的答案后,下面的一行代码将完全按照您的要求执行。只需使用以下事实,即所讨论的列始终是第二列

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

对数据帧进行子集,以便

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

这是一个很容易找到的答案,所以我建议你在发帖之前先看一看。

@WilliamAshford放弃专栏只是我想达到的第二步。在删除之前,我需要测试专栏中的一个值。好吧,这是在最初的帖子之后添加的,但我会努力修改答案,使其可行。忽略不计,因为我无法在鲁伊·巴拉达斯答案的简单性基础上显着构建。