R 将字符附加到具有匹配值的行的百分比

问题描述 投票:0回答:1

我有一个数据框“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。

r append
1个回答
0
投票

使用 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
代替连接数据。)

© www.soinside.com 2019 - 2024. All rights reserved.