我尝试根据列的值来对数据帧进行子集,该列可以在不同版本的数据帧上更改名称。我要测试的值是" ----"在名为" 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")])
答案 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'))]
这是一个非常容易找到答案的答案,我建议你在发布问题之前先看看。