如何用随机数替换数据集中的特定值?

时间:2019-04-20 00:12:44

标签: r if-statement sample mutate

我有一个数据列,其中包含一串范围作为字符串(例如“ 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")

有人知道怎么做吗?

2 个答案:

答案 0 :(得分:1)

我们可以在"to"上拆分字符串,然后将两个数字转换为数字后在两个数字之间创建一个范围,然后使用sample选择范围内的任何一个数字。

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)

答案 1 :(得分:0)

我们可以使用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))