我有一个数据框“df”,如下所示:
日期 | 价值1 | 价值2 |
---|---|---|
2022-03-14 13:00:00 | AMRO | 3 |
2022-03-14 13:10:00 | AMRO | 4 |
2022-03-14 13:20:00 | CHSP | 5 |
2022-03-14 13:30:00 | CHSP | 6 |
2022-03-14 13:40:00 | AMRO | 7 |
2022-03-14 13:50:00 | CHSP | 8 |
2022-03-14 14:00:00 | AMRO | 40 |
2022-03-14 14:10:00 | AMRO | 50 |
2022-03-14 14:20:00 | CHSP | 60 |
2022-03-14 14:30:00 | AMRO | 70 |
2022-03-14 14:40:00 | AMRO | 80 |
2022-03-14 14:50:00 | CHSP | 90 |
如何将“1”随机附加到“Value1”列中百分之五十的 AMRO 值和“Value1”列中百分之三十的 CHSP 值?理想的解决方案是使用具有匹配四字母代码的百分比列表来修改 Value1 中的不同四字母代码,以防存在许多不同的四字母代码,而不仅仅是如此处所示的 AMRO 和 CHSP。
使用 dplyr 的一种方法:
library(dplyr)
probs <- data.frame(Value1 = c("AMRO", "CHSP"), prob = c(0.5, 0.3))
set.seed(42)
out <- quux %>%
left_join(probs, by = "Value1") %>%
group_by(Value1) %>%
mutate(Value1b = paste0(Value1, if_else(row_number() %in% sample(n(), size=ceiling(n()*first(prob))), "1", ""))) %>%
ungroup()
out
# # A tibble: 12 × 5
# Date Value1 Value2 prob Value1b
# <chr> <chr> <int> <dbl> <chr>
# 1 2022-03-14 13:00:00 AMRO 3 0.5 AMRO1
# 2 2022-03-14 13:10:00 AMRO 4 0.5 AMRO
# 3 2022-03-14 13:20:00 CHSP 5 0.3 CHSP
# 4 2022-03-14 13:30:00 CHSP 6 0.3 CHSP1
# 5 2022-03-14 13:40:00 AMRO 7 0.5 AMRO
# 6 2022-03-14 13:50:00 CHSP 8 0.3 CHSP
# 7 2022-03-14 14:00:00 AMRO 40 0.5 AMRO
# 8 2022-03-14 14:10:00 AMRO 50 0.5 AMRO1
# 9 2022-03-14 14:20:00 CHSP 60 0.3 CHSP1
# 10 2022-03-14 14:30:00 AMRO 70 0.5 AMRO1
# 11 2022-03-14 14:40:00 AMRO 80 0.5 AMRO1
# 12 2022-03-14 14:50:00 CHSP 90 0.3 CHSP
通过几次调用
table
我们可以看到比例的变化:
table(out$Value1)
# AMRO CHSP
# 7 5
table(out$Value1b)
# AMRO AMRO1 CHSP CHSP1
# 3 4 3 2
我分配了一个新名称
Value1b
只是为了并排比较;如果您不担心“丢失”原始信息,请随时将其分配回 Value1
:-)
我选择使用
row_number() %in% sample(..)
,因为使用 runif
可能会导致比 probs$prob
更少或更多。
我选择使用某种“字典”来
left_join
进入数据,这样如果您有更多的 Value1
值而不仅仅是两个,那么就很容易扩展到它们。 (也可以使用 dplyr::case_when
代替连接数据。)