如何用随机数替换数据集中的特定值?
How to replace specific values in a dataset with randomized numbers?
我有一个数据列,其中包含一堆字符串形式的范围(例如“2 到 4”、“5 到 6”、“7 到 8”等)。我正在尝试创建一个新列,将这些值中的每一个转换为给定范围内的随机数。我如何在我的函数中利用条件逻辑来解决这个问题?
我认为函数应该是这样的:
df<-mutate(df, c2=ifelse(df$c=="2 to 4", sample(2:4, 1, replace=TRUE), "NA"))
这应该会在我的数据集中生成一个新列,用 2 到 4 之间的随机整数替换所有“2 到 4”的值,但是,这不起作用并将每个值替换为 "NA" .
理想情况下,我正在尝试做一些数据集:
df<-c("2 to 4","2 to 4","5 to 6")
将添加一个新列:
df<-c2("3","2","5")
有人知道怎么做吗?
我们可以拆分 "to"
上的字符串并在将它们转换为数字后在两个数字之间创建一个范围,然后使用 sample
到 select 范围内的任何一个数字.
df$c2 <- sapply(strsplit(df$c1, "\s+to\s+"), function(x) {
vals <- as.integer(x)
sample(vals[1]:vals[2], 1)
})
df
# c1 c2
#1 2 to 4 2
#2 2 to 4 3
#3 5 to 6 5
数据
df<- data.frame(c1 = c("2 to 4","2 to 4","5 to 6"), stringsAsFactors = FALSE)
我们可以使用 sub
轻松做到这一点。将 to
替换为 :
和 eval
uate 以获取序列,然后从中获取 1 的 sample
df$c2 <- sapply(sub(" to ", ":", df$c1), function(x)
sample(eval(parse(text = x)), 1))
df
# c1 c2
#1 2 to 4 4
#2 2 to 4 3
#3 5 to 6 5
或 gsubfn
library(gsubfn)
as.numeric(gsubfn("(\d+) to (\d+)", ~ sample(seq(as.numeric(x),
as.numeric(y), by = 1), 1), df$c1))
或 read.table/Map
来自 base R
sapply(do.call(Map, c(f = `:`, read.csv(text = sub(" to ", ",", df$c1),
header = FALSE))), sample, 1)
数据
df <- structure(list(c1 = c("2 to 4", "2 to 4", "5 to 6")),
class = "data.frame", row.names = c(NA, -3L))
我有一个数据列,其中包含一堆字符串形式的范围(例如“2 到 4”、“5 到 6”、“7 到 8”等)。我正在尝试创建一个新列,将这些值中的每一个转换为给定范围内的随机数。我如何在我的函数中利用条件逻辑来解决这个问题?
我认为函数应该是这样的:
df<-mutate(df, c2=ifelse(df$c=="2 to 4", sample(2:4, 1, replace=TRUE), "NA"))
这应该会在我的数据集中生成一个新列,用 2 到 4 之间的随机整数替换所有“2 到 4”的值,但是,这不起作用并将每个值替换为 "NA" .
理想情况下,我正在尝试做一些数据集:
df<-c("2 to 4","2 to 4","5 to 6")
将添加一个新列:
df<-c2("3","2","5")
有人知道怎么做吗?
我们可以拆分 "to"
上的字符串并在将它们转换为数字后在两个数字之间创建一个范围,然后使用 sample
到 select 范围内的任何一个数字.
df$c2 <- sapply(strsplit(df$c1, "\s+to\s+"), function(x) {
vals <- as.integer(x)
sample(vals[1]:vals[2], 1)
})
df
# c1 c2
#1 2 to 4 2
#2 2 to 4 3
#3 5 to 6 5
数据
df<- data.frame(c1 = c("2 to 4","2 to 4","5 to 6"), stringsAsFactors = FALSE)
我们可以使用 sub
轻松做到这一点。将 to
替换为 :
和 eval
uate 以获取序列,然后从中获取 1 的 sample
df$c2 <- sapply(sub(" to ", ":", df$c1), function(x)
sample(eval(parse(text = x)), 1))
df
# c1 c2
#1 2 to 4 4
#2 2 to 4 3
#3 5 to 6 5
或 gsubfn
library(gsubfn)
as.numeric(gsubfn("(\d+) to (\d+)", ~ sample(seq(as.numeric(x),
as.numeric(y), by = 1), 1), df$c1))
或 read.table/Map
来自 base R
sapply(do.call(Map, c(f = `:`, read.csv(text = sub(" to ", ",", df$c1),
header = FALSE))), sample, 1)
数据
df <- structure(list(c1 = c("2 to 4", "2 to 4", "5 to 6")),
class = "data.frame", row.names = c(NA, -3L))