基本上我有一个如下所示的数据框: 是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;?
感谢您的帮助!
答案 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
。