我有一个数据框m
A 2
B 3
C 4
我想创建一个像
这样的数据框A 1
A 2
B 1
B 2
B 3
C 1
C 2
C 3
C 4
有任何帮助吗?非常感谢提前
答案 0 :(得分:5)
您的原始问题可以通过以下方式回答:
text <- LETTERS[1:3]
n <- 2:4
rep(text, times=n)
[1] "A" "A" "B" "B" "B" "C" "C" "C" "C"
你的新问题非常不同:
df <- data.frame(
text <- LETTERS[1:3],
n <- 2:4
)
data.frame(
text = rep(df$text, times=df$n),
seq = sequence(df$n)
)
text seq
1 A 1
2 A 2
3 B 1
4 B 2
5 B 3
6 C 1
7 C 2
8 C 3
9 C 4
答案 1 :(得分:3)
假设m
是一个数据框:
m <- data.frame(V1 = LETTERS[1:3], V2 = 2:4, stringsAsFactors = FALSE)
这将做你想要的:
with(m, rep(V1, times = V2))
e.g。
> with(m, rep(V1, times = V2))
[1] "A" "A" "B" "B" "B" "C" "C" "C" "C"
编辑:要解决OP所做的编辑,请尝试以下操作:
with(m, data.frame(X1 = rep(V1, times = V2),
X2 = unlist(lapply(V2, seq_len))))
产生:
> with(m, data.frame(X1 = rep(V1, times = V2),
+ X2 = unlist(lapply(V2, seq_len))))
X1 X2
1 A 1
2 A 2
3 B 1
4 B 2
5 B 3
6 C 1
7 C 2
8 C 3
9 C 4
或更简洁地通过sequence()
- 根据@Andrie的答案(我也一直忘记):
with(m, data.frame(X1 = rep(V1, times = V2), X2 = sequence(V2)))
答案 2 :(得分:3)
rep
接受矢量。试试这个:
dat <- data.frame(V1 = letters[1:3], V2 = 2:4)
rep(dat[, 1], dat[, 2])
> rep(dat[, 1], dat[, 2])
[1] a a b b b c c c c
答案 3 :(得分:2)
m <- data.frame(V1 = LETTERS[1:3], V2 = 2:4, stringsAsFactors = FALSE)
library(plyr)
ddply(m,"V1",function(x) data.frame(V2=seq(x[,2])))