我有一个包含三列的数据框。第一个是“ 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
答案 0 :(得分:2)
您可以使用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 :(得分: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)
在tidyverse
和b
之间创建一个序列,并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