如何用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