2016-07-27 96 views
0

我有一个类似于下表给出的数据框。根据R中另一列中的值重置单元格值

sponbrand aidbrand 
1  <NA>  LAYS 
2  <NA>  LAYS 
3  <NA>  <NA> 
4  <NA>  LAYS 
5  LAYS  LAYS 
6  <NA>  <NA> 

可再现的格式如下:

structure(list(sponbrand = c(NA, NA, NA, NA, "LAYS", NA), aidbrand = c("LAYS", 
"LAYS", NA, "LAYS", "LAYS", NA)), .Names = c("sponbrand", 
"aidbrand"), row.names = c(NA, 6L), class = "data.frame") 

我想设置如下:

如果我有一个全新的sponbrand我想设置在aidbrand相应的行作为NA。在上面的例子中,行号5在列标记中放置了它。我在第5行中也列出了aidbrand专栏,我希望将其设置为NA,同时保留援助品牌中的其他品牌。所需的输出如下:

sponbrand aidbrand 
1  <NA>  LAYS 
2  <NA>  LAYS 
3  <NA>  <NA> 
4  <NA>  LAYS 
5  LAYS  NA ---->> This is the row I want to reset, while retaining the rest. 
6  <NA>  <NA> 

我用下面的代码:CC是我DF:

if("aidbrand" %in% colnames(cc)){cc$aidbrand <- ifelse(cc$sponbrand == "LAYERR", NA, cc$aidbrand)} 

此代码工作完全当我有细胞无NA在sponbrand。然而,对于当前数据集,此代码将aidbrand中的每个单元格设置为NA,而我希望保留aidbrand列中已存在的品牌。

+0

'如果( “aidbrand” %的%colnames(CC)){$ CC aidbrand < - ifelse (cc $ sponbrand ==“LAYS”&!is.na(cc $ sponbrand),NA,cc $ aidbrand)}'在ifelse中添加另一个条件检查。由于NA == ...返回NA,并且IFelse(NA,...,...)也返回NA。然而,'NA&FALSE'返回FALSE – Psidom

回答

1

这是不是你以后在做什么?我认为你正在做的复杂得多,它需要

#Recreate the dataset 
data<-data.frame(sponbrand = as.character(c(NA, NA, NA, NA, "LAYS", NA)), 
       aidbrand = as.character(c("LAYS", "LAYS", NA, "LAYS", "LAYS", NA))) 
data$aidbrand<-ifelse(!is.na(data$sponbrand),as.character(NA),as.character(data$aidbrand)) 
data 

回报:

sponbrand aidbrand 
1  <NA>  LAYS 
2  <NA>  LAYS 
3  <NA>  <NA> 
4  <NA>  LAYS 
5  LAYS  <NA> 
6  <NA>  <NA> 
+0

...这工作....我错过了传递as.character(NA)...因为我的原始变量是因素,我将它们转换为字符,我以为我的代码将工作...再次感谢您。 – Apricot

1

使用data.table

setDT(df) 
df[!is.na(sponbrand), aidbrand := NA] 

使用基础R

df[!is.na(df$sponbrand), ]$aidbrand <- NA 
+0

@snoram ...谢谢你...你的代码也可以工作。我不知道数据表选项。 – Apricot

+0

data.table(包)在处理非常大的数据集时应该快得多。 – snoram

相关问题