从数据框中删除某些值

时间:2017-07-27 16:51:52

标签: r dataframe

基本上我有一个如下所示的数据框: 是myDF

            Beg1  Beg2  Beg3  
Pathway1    Sort  AMP   Cool 
Pathway2    Gi    Try   Agt   
Pathway3    AMP   Abor  Myt  

我希望它看起来像这样: 修改后的mydf

            Beg1  Beg2  Beg3  
Pathway1    <NA>  AMP   <NA>  
Pathway2    Gi    Try   Agt   
Pathway3    AMP   <NA>  <NA>      

如果不清楚,则所有小写字母都替换为&#34; NA&#34;&#39; s。我知道这与问题(Removing certain values from the dataframe in R)非常相似,但是@jeremycg给出的解决方案对我的数据不起作用。

基本上,我尝试过以下的事情: 1)

mydf[mydf!="AMP" | "Gi" | "Try" | "Agt"] <- NA

但是我收到了这个错误:

operations are possible only for numeric, logical or complex types

2)

mydf[mydf!="AMP" |mydf!="Gi" |mydf!="Try" | mydf!= "Agt"] <- NA

但整个数据框填满了&#34; NA&#34;&#39>

3)

for (i in 1:ncol(mydf)){if(mydf!="AMP"|mydf!="Gi"|mydf!="Try"|mydf!="Agt"){<- NA}}

但是我得到了这个错误(重复了很多次)

the condition has length > 1 and only the first element will be used

*我真的不知道自己在做什么

4)

mydf[mydf!=("AMP"%in%"Gi"%in%"Try"%in%"AGT")] <- NA

但是整个数据框再次充满了&#34; NA&#34;&#39>

那么,是否有人对如何将所有值不等于&#34; AMP&#34;,&#34; Gi&#34;,&#34;尝试&#34 ;或&#34; AGT&#34;进入&#34; NA&#34;?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我们根据创建带lapply(...的逻辑索引

,将数据集的列(replace),%in%循环到NA
v1 <- c("Sort", "Abor", "Cool", "Myt")
mydf[] <- lapply(mydf, function(x) replace(x, x %in% v1, NA))
mydf
#         Beg1 Beg2 Beg3
#Pathway1 <NA>  AMP <NA>
#Pathway2   Gi  Try  Agt
#Pathway3  AMP <NA> <NA>

答案 1 :(得分:0)

你的第二个建议是非常接近工作,只有一些与布尔逻辑混淆。相反,我们希望匹配所有不等于至少一个字符串的值。这看起来像是:

mydf[!(mydf=="AMP" | mydf=="Gi" | mydf=="Try" | mydf== "Agt")] <- NA

我还建议您查看dplyr package数据操作任务,它看起来像:

library(dplyr)
df <-  data.frame(beg1 = c("Sort", "Gi", "AMP"),
                  beg2 = c("AMP",    "Try",   "Abor"),
                  beg3 = c("Cool",   "Agt",  "Myt"), stringsAsFactors = FALSE)     

keep_list <- c("AMP", "Gi", "Try", "Agt")

df <- df %>% mutate_all(funs(ifelse(. %in% keep_list, ., NA)))

这会将funs中的表达式应用于所有列,表达式中的点引用列中的值。在这种情况下,如果值在要保留的字符串列表中,它将保持不变,否则将为NA