如何替换data.frame中列中的值不等于具有NA的随机选择值?

时间:2016-02-06 04:07:05

标签: r replace na

我从a中的变量df data.frame中随机选择了30个值。

set.seed(123) 
date <- as.Date(seq(as.Date("2003-01-01"), as.Date("2003-05-31"), by = 1), format="%Y-%m-%d") 
a    <- runif(151, 0.005, 2.3) 
df   <- data.frame(date, a) 
#select 30 random samples
rans <-sample(length(df$a), 30)

我尝试过此操作,并将df$a中与rans等于NAs的所有值替换为df[,2][rans] <- NA

df$a

但是我想将rans NOT EQUAL 中的所有值替换为NAs df[,2][!rans] <- NA #didn't work df[,2][!rans %in% df] <- NA #replaced all values in df$a with NAs ,所以我尝试了以下但是没有&#39;工作

{{1}}

有任何建议怎么做?

2 个答案:

答案 0 :(得分:1)

你可以尝试

df[-rans,2] <- NA

负值只会丢弃列表中的那些元素

答案 1 :(得分:1)

使用否定索引可能不是更好,而是使用setdiff。我们使用setdiff得到那些在'rans'中找不到的行序列的行索引,然后将与这些行对应的第二列值分配为NA。

df[setdiff(seq_len(nrow(df)), rans),2] <- NA

或者代替setdiff,我们使用%in%来获取公共元素的逻辑向量,然后否定(!),以便TRUE变为FALSE,FALSE变为TRUE。将与行对应的第2列值指定为NA。

df[!(seq_len(nrow(df)) %in% rans), 2] <- NA

如果我们使用data.table,我们会将'data.frame'转换为'data.table'(setDT(df)),并将'a'分配给'NA',而不是那些没有满足条件(如上所述)。

library(data.table)
setDT(df)[!(1:.N %in% rans), a:= NA]

为什么OP的代码不起作用?

  1. 第一个选项

    df[,2][!rans] <- NA
    

    无效,因为

    !rans
    #[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    #[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    

    提供所有FALSE值。 否定运算符(!)将vector/column中的“0”值转换为TRUE,将所有其他值转换为FALSE。由于'rans'没有任何0值,所有这些都被转换为FALSE。因此,通过基于所有FALSE的逻辑索引进行分配,不会将第2列中的任何相应值替换为NA。

  2. 第二个选项

    df[,2][!rans %in% df] <- NA  
    

    'df'是data.frame,列中的值与'rans'中的值不匹配。所以它将再次全部失败。

    rans %in% df
    #[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    #[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    

    通过否定上述内容,所有元素现在都为TRUE,因此它将第二列中的所有值设置为子集,并通过将这些元素分配给NA,我们得到一个具有完整NA值的列。