Получить значения из числовой линии в определенной позиции - PullRequest
1 голос
/ 28 мая 2019

У меня есть датафрейм с тремя столбцами.Первое - это «A» или «B», второе - это значение, а третье - это значение (от и до).Теперь я хочу получить значения первого столбца для заданных значений двух других столбцов.

Я получил этот фрейм данных:

a <- c('A','B','A','B')
b <- c(0,40,60,80)
c <- c(40,60,80,100)

frame <- data.frame(a,b,c)

> frame
  a  b   c
1 A  0  40
2 B 40  60
3 A 60  80
4 B 80 100

И я хочу сгенерировать этот второй фрейм данныхот первого.

> frame2
   d   e
1  A  10
2  A  20
3  A  30
4  A  40
5  B  50
6  B  60
7  A  70
8  A  80
9  B  90
10 B 100

Ответы [ 4 ]

2 голосов
/ 28 мая 2019

Вы можете использовать pmap из tidyverse (purrr)

library(tidyverse)

pmap_dfr(frame, ~tibble(a = ..1, e = seq(..2 + 10, ..3, 10)))

# # A tibble: 10 x 2
#        a     e
#    <int> <dbl>
#  1     1    10
#  2     1    20
#  3     1    30
#  4     1    40
#  5     2    50
#  6     2    60
#  7     1    70
#  8     1    80
#  9     2    90
# 10     2   100

Редактировать: На самом деле, вы должны исправить тот факт, что a преобразуется в коэффициент на data.frameпервый.

frame <- frame %>% mutate_if(is.factor, as.character)

pmap_dfr(frame, ~tibble(a = ..1, e = seq(..2 + 10, ..3, 10)))

# # A tibble: 10 x 2
#    a         e
#    <chr> <dbl>
#  1 A        10
#  2 A        20
#  3 A        30
#  4 A        40
#  5 B        50
#  6 B        60
#  7 A        70
#  8 A        80
#  9 B        90
# 10 B       100
1 голос
/ 28 мая 2019

Опция с tidyverse путем создания последовательности между b и c и unnest с указанием значений.

library(tidyverse)

frame %>%
  mutate(value = map2(b + 10, c, seq, by = 10)) %>%
  unnest(value) %>%
  select(-b, -c)

#   a value
#1  A    10
#2  A    20
#3  A    30
#4  A    40
#5  B    50
#6  B    60
#7  A    70
#8  A    80
#9  B    90
#10 B   100
1 голос
/ 28 мая 2019

Идея через базу R,

l1 <- setNames(Map(function(i, j)seq(i, j, 10)[-1], frame$b, frame$c), frame$a)
data.frame(d = rep(names(l1), lengths(l1)), e = unlist(l1))
#   d   e
#1  A  10
#2  A  20
#3  A  30
#4  A  40
#5  B  50
#6  B  60
#7  A  70
#8  A  80
#9  B  90
#10 B 100

Более простой способ - использовать stack (как упоминает @Ronak Shah в комментариях)

stack(setNames(mapply(seq, frame$b + 10, frame$c, MoreArgs = list(by = 10)), frame$a))
0 голосов
/ 28 мая 2019

Опция в base R

stack(setNames(apply(frame[-1], 1, function(x) 
        seq(x[1]+10, x[2], by = 10)), frame[,1]))[2:1]
#    ind values
#1    A     10
#2    A     20
#3    A     30
#4    A     40
#5    B     50
#6    B     60
#7    A     70
#8    A     80
#9    B     90
#10   B    100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...