根据条件列名子集dataframe
我试图根据一列的值来子集一个数据帧,该列可以在数据帧的不同版本中更改名称。我要测试的值在名为“SIC”或“NAICS”的列中为“----” 第1版:根据条件列名子集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 --
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放弃专栏只是我想达到的第二步。在删除之前,我需要测试专栏中的一个值。好吧,这是在最初的帖子之后添加的,但我会努力修改答案,使其可行。忽略不计,因为我无法在鲁伊·巴拉达斯答案的简单性基础上显着构建。