从数字行的特定位置获取值

时间:2019-05-28 12:09:57

标签: r

我有一个包含三列的数据框。第一个是“ 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 个答案:

答案 0 :(得分:2)

您可以使用pmaptidyverse)中的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 :(得分:1)

基于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))

答案 2 :(得分:1)

tidyverseb之间创建一个序列,并c对值进行排序。{p>

unnest

答案 3 :(得分:0)

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