在 R 数据框中用 NA 随机替换每组值的百分比
randomly replacing percentage of values per group with NA in R dataframe
我有一个包含不同大小的不同组 (ID) 的数据框。在每个组中,我想用 NA 随机替换“值”列中特定百分比的值(比如 30%)。这是我的数据的简化版本:
ID<-rep(c("X1","X2"),times=c(3,6))
value<-c(1,2,3,1,2,3,4,5,6)
df1 <- data.frame(ID,value)
df1
ID value
X1 1
X1 2
X1 3
X2 1
X2 2
X2 3
X2 4
X2 5
X2 6
这是我想要的:
ID value
X1 1
X1 NA
X1 3
X2 1
X2 2
X2 NA
X2 4
X2 5
X2 NA
知道我该怎么做吗?我更喜欢使用 tidyverse,但如果您有其他选择,我将不胜感激!
假设数据在 df
df[sample(seq(nrow(df)), nrow(df) *0.3), "value"] <- NA
我们可以使用dplyr
。按 'ID' 分组,使用 sample
获取索引或 30% 的行,并在 replace
中使用它用 NA
替换 'value'
library(dplyr)
df1 %>%
group_by(ID) %>%
mutate(value = replace(value, sample(row_number(),
size = ceiling(0.3 * n()), replace = FALSE), NA) )
# A tibble: 9 x 2
# Groups: ID [2]
# ID value
# <chr> <dbl>
#1 X1 NA
#2 X1 2
#3 X1 3
#4 X2 NA
#5 X2 2
#6 X2 NA
#7 X2 4
#8 X2 5
#9 X2 6
您可以使用 sample()
获取数据的随机索引。
你可以试试这个
df <- data.frame(ID = paste("X", 1:10),
value = rnorm(10))
fraction <- 0.30
df$value[sample(1:length(df$value), size = round(length(df$value) * fraction))] <- NA
#30% of the values in df$value will then be NA
我有一个包含不同大小的不同组 (ID) 的数据框。在每个组中,我想用 NA 随机替换“值”列中特定百分比的值(比如 30%)。这是我的数据的简化版本:
ID<-rep(c("X1","X2"),times=c(3,6))
value<-c(1,2,3,1,2,3,4,5,6)
df1 <- data.frame(ID,value)
df1
ID value
X1 1
X1 2
X1 3
X2 1
X2 2
X2 3
X2 4
X2 5
X2 6
这是我想要的:
ID value
X1 1
X1 NA
X1 3
X2 1
X2 2
X2 NA
X2 4
X2 5
X2 NA
知道我该怎么做吗?我更喜欢使用 tidyverse,但如果您有其他选择,我将不胜感激!
假设数据在 df
df[sample(seq(nrow(df)), nrow(df) *0.3), "value"] <- NA
我们可以使用dplyr
。按 'ID' 分组,使用 sample
获取索引或 30% 的行,并在 replace
中使用它用 NA
library(dplyr)
df1 %>%
group_by(ID) %>%
mutate(value = replace(value, sample(row_number(),
size = ceiling(0.3 * n()), replace = FALSE), NA) )
# A tibble: 9 x 2
# Groups: ID [2]
# ID value
# <chr> <dbl>
#1 X1 NA
#2 X1 2
#3 X1 3
#4 X2 NA
#5 X2 2
#6 X2 NA
#7 X2 4
#8 X2 5
#9 X2 6
您可以使用 sample()
获取数据的随机索引。
你可以试试这个
df <- data.frame(ID = paste("X", 1:10),
value = rnorm(10))
fraction <- 0.30
df$value[sample(1:length(df$value), size = round(length(df$value) * fraction))] <- NA
#30% of the values in df$value will then be NA