根据R中另一列中的值重置单元格值

时间:2016-07-27 15:33:35

标签: 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,在sponbrand列中有Lays。我在第5行也列出了援助品栏,我想将其设置为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)}

当我在sponbrand中没有NA的单元格时,此代码可以正常工作。但是,对于当前数据集,此代码将aidbrand中的每个单元格设置为NA,而我希望保留已存在于aidbrand列中的品牌。

2 个答案:

答案 0 :(得分:1)

使用data.table

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

使用基础R

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

答案 1 :(得分: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>