R:随机更改数据框中的值

Posted

技术标签:

【中文标题】R:随机更改数据框中的值【英文标题】:R: Randomly Changing Values in a Dataframe 【发布时间】:2022-01-20 20:20:54 【问题描述】:

我正在使用 R 编程语言。假设我有以下数据框:

a = rnorm(100,10,1)
b = rnorm(100,10,5)
c = rnorm(100,10,10)

my_data = data.frame(a,b,c)

head(my_data)

         a         b         c
1 9.623328 10.560865 18.520644
2 7.805709 14.550575  1.144607
3 9.290704 16.597876 26.662429
4 8.828285 10.229534 -8.228798
5 9.454419  5.059026 18.454799
6 9.835949 16.778726  2.372435

我的问题:对于这个数据框中的每个变量,我想用 0 随机替换这些数字的 50%。

这是我想到的一种低效的方法:

my_data$a_new <- sample( LETTERS[1:2], 100, replace=TRUE, prob=c(0.5, 0.5) )
my_data$b_new <- sample( LETTERS[1:2], 100, replace=TRUE, prob=c(0.5, 0.5) )
my_data$c_new <- sample( LETTERS[1:2], 100, replace=TRUE, prob=c(0.5, 0.5) )

my_data$a_new2 = ifelse(my_data$a_new == "A", my_data$a, 0)
my_data$b_new2 = ifelse(my_data$b_new == "B", my_data$b, 0)
my_data$c_new2 = ifelse(my_data$b_new == "C", my_data$c, 0)

有没有更有效的方法来做到这一点?

【问题讨论】:

【参考方案1】:

你可以使用lapply -

my_data[] <- lapply(my_data, function(x) 
  x[sample(seq_along(x), length(x)/2)] <- 0
  x
)

如果对于不同的列,你有一个差异百分比来替换为 0,你可以使用Map

perc <- c(0.2, 0.4, 0.5)

my_data[] <- Map(function(x, y) 
  x[sample(seq_along(x), length(x) * y)] <- 0
  x
, my_data, perc)

【讨论】:

@Ronak Shah:谢谢你的回答!假设我想用 0 随机替换“a”的 20% 的值,用 0 替换“b”的 40% 的值,用 0 替换“c”的 50% 的值。是否仍然可以调整您的代码这个任务?或者必须重写哪些代码?非常感谢! 您可以使用Map 执行此任务。我已经更新了答案以显示如何。

以上是关于R:随机更改数据框中的值的主要内容,如果未能解决你的问题,请参考以下文章

将大 csv 文件中的小随机样本加载到 R 数据框中

如何根据条件更改考拉数据框中的值

如何使用 selectInput 从 R 中的数据框中选择特定列?

as.numeric 函数更改我的数据框中的值[重复]

如果另一个Dataframe值小于0,则替换R数据框中的值

什么函数允许我根据R中列中的值从数据框中的列中提取数据?