我从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}}
有任何建议怎么做?
答案 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的代码不起作用?
第一个选项
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。
第二个选项
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值的列。