Как заменить определенные значения в наборе данных на случайные числа? - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть столбец данных, который содержит несколько диапазонов в виде строк (например, «от 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 ]

1 голос
/ 20 апреля 2019

Мы можем разбить строку на "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)
0 голосов
/ 20 апреля 2019

Мы можем сделать это легко с sub.Замените to на : и eval uate, чтобы получить последовательность, затем получите sample из 1

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)

data

df <- structure(list(c1 = c("2 to 4", "2 to 4", "5 to 6")), 
 class = "data.frame", row.names = c(NA, -3L))
...