如何用NAs替换data.frame中不等于随机选择值的列中的值?

如何用NAs替换data.frame中不等于随机选择值的列中的值?,r,replace,na,R,Replace,Na,我从df data.frame中的变量a中随机选择了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 <-sam

我从
df data.frame
中的变量
a
中随机选择了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)
但是我想用
NAs
替换
df$a
不等于
rans
的所有值,所以我尝试了以下方法,但没有成功

df[,2][!rans] <- NA            #didn't work           
df[,2][!rans %in% df] <- NA    #replaced all values in df$a with NAs
df[,2][!rans]你可以试试

df[-rans,2] <- NA

df[-rans,2]使用负索引可能不是更好,而是使用
setdiff
。我们通过使用
setdiff
,获得那些在“rans”中找不到的行序列的行索引,然后将对应于这些行的第二列值指定为NA

df[setdiff(seq_len(nrow(df)), rans),2] <- NA
df[!(seq_len(nrow(df)) %in% rans), 2] <- NA
如果我们使用
data.table
,我们将'data.frame'转换为'data.table'(
setDT(df)
),并将不满足条件的行的'a'分配给'NA'


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

  • 第一选项

    df[,2][!rans] <- NA
    
    df[,2][!rans %in% df] <- NA  
    
    给出所有
    FALSE
    值。 求反运算符(
    )将
    向量/列中的“0”值转换为TRUE,将所有其他值转换为FALSE。由于“rans”没有任何0值,因此它们都被转换为FALSE。因此,通过基于逻辑索引all FALSE赋值,不会将第2列中的任何对应值替换为NA

  • 第二选项

    df[,2][!rans] <- NA
    
    df[,2][!rans %in% df] <- NA  
    
    通过对上述元素求反,所有元素现在都为真,因此它将第2列中的所有值都子集,通过将这些元素赋给NA,我们得到一个包含完整NA值的列


  • @阿克伦。。。为什么你不喜欢使用负数?听起来做
    setdiff(seq_len(nrow(df)),rans)比只做
    -rans
    @CarlosAlberto需要更多的时间。在这种情况下,它可能与负索引一起工作。但是,总的来说,可能存在一些问题。例如,考虑两个没有任何匹配的向量,我们尝试做否定索引,而预期输出是不同的。i、 e.
    v1@akrun谢谢你的回复,但我不以你为例。如果
    v2
    是索引,
    v1
    没有那么多的元素,因此
    v1[-v2]
    v1
    相同。另一方面,如果
    v1
    是索引,
    v2[-v1]
    将给出
    整数(0)
    。这里的要点是,两个向量并不表示相同(一个是值,另一个是位置)。通常,我更喜欢使用向量的值进行过滤(因此
    v1
    v2
    将引用与
    v1[which(v1%In%v2)]
    v1[!which(v1%In%v2)]
    但是如果你已经有了这些头寸,那么使用它们似乎更快更容易。@CarlosAlberto我只是举一个负指数不起作用的例子。你可以随意使用。
    df[,2][!rans %in% df] <- NA  
    
    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