从具有多个值的行中随机 select 1 个值;使用清理过的数据创建一个新列

Randomly select 1 value from rows with multiple values; create a new column with cleaned data

似乎是一个简单的函数,但似乎找不到在 R 上实现它的好方法。我有一个列 P,它有很多行和多个输入:

P:

[340000, 410000]
[450000, 450000]
530000
110000
[330000, 440000]
510000
440000
620000
320000

所需的 P1(* 值应随机选择):(对间距表示歉意,间距只是为了让每个值都是不同的行)

340000*

450000*

530000
110000
440000*

510000
440000
620000
320000

我想构建一个新列,它从 P 列中以“[”开头的每个行向量中随机选择 1 个值,然后吐出一个新列 P1,其中包含更正后的值+其他独立的行值。这是清洁色谱柱的更大努力的一部分,因此它可用于回归。

现在,我想出了这个 tidyverse 代码作为变异的最佳选择:

foo <- data.frame(P=="[")
foo %>%
  rowwise %>%
  mutate(P1 = sample(P, 1))

但这并没有返回我需要的输出。除了 sample(),我不确定还有什么可以用于从 [] 向量中随机选择。我想知道解决这个问题的最佳方法是什么?感谢帮助。

您可以从列值中删除 [],用逗号拆分数据并在不同的行中获取每个值。对于每一行,您可以 select 1 个随机值。

library(dplyr)

df %>%
  mutate(P1 = gsub('\[|\]', '', P), 
         row = row_number()) %>%
  tidyr::separate_rows(P1, sep = ',\s*') %>%
  group_by(row) %>%
  slice_sample(n = 1) %>%
  #In older version of dplyr use sample_n
  #sample_n(1)
  ungroup %>%
  select(-row)

#    P                P1    
#  <chr>            <chr> 
#1 [340000, 410000] 340000
#2 [450000, 450000] 450000
#3 530000           530000
#4 110000           110000
#5 [330000, 440000] 440000
#6 510000           510000
#7 440000           440000
#8 620000           620000
#9 320000           320000

在基础 R 中,您可以使用

实现相同的逻辑
df$P1 <- sapply(strsplit(gsub('\[|\]', '', df$P), ',\s*'), sample, 1)

数据

df <- structure(list(P = c("[340000, 410000]", "[450000, 450000]", 
"530000", "110000", "[330000, 440000]", "510000", "440000", "620000", 
"320000")), class = "data.frame", row.names = c(NA, -9L))