从具有多个值的行中随机 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))
似乎是一个简单的函数,但似乎找不到在 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))