这是我的数据框“data.frame”
X Y
1 10 12
2 20 22
3 30 32
低于我想要的。
1)添加一个名为“New_col”的新列
2)给定id的每个单元是从X值到Y值的序列(步骤1)。
X Y New_col
1 10 12 10
11
12
2 20 22 20
21
22
3 30 32 30
31
32
然后填充空单元格
X Y New_col
1 10 12 10
1 10 12 11
1 10 12 12
2 20 22 20
2 20 22 21
2 20 22 22
3 30 32 30
3 30 32 31
3 30 32 32
我尝试了以下内容:
New_col<-seq(from = data.frame$X, to = data.frame$Y, by = 1)
此代码仅为第一行计算序列的问题。 然后我尝试了一个循环:
for (i in 1: length(data.frame$X))
{
New_col <-seq(from = data.frame$X, to = data.frame$Y, by = 1)
}
这是我得到的错误:
Error in seq.default(from = data.frame$X, to = data.frame$Y, by = 1) :
'from' must be of length 1
感谢您的帮助。
答案 0 :(得分:2)
您可以使用apply
:
do.call(rbind, apply(dat, 1, function(x)
data.frame(X = x[1], Y = x[2], New_col = seq(x[1], x[2]))))
其中dat
是数据框的名称。您可以忽略警告。
X Y New_col
1.1 10 12 10
1.2 10 12 11
1.3 10 12 12
2.1 20 22 20
2.2 20 22 21
2.3 20 22 22
3.1 30 32 30
3.2 30 32 31
3.3 30 32 32
答案 1 :(得分:2)
这是data.table包的一个很好的用例(您必须先安装它):
dat = read.table(text=" X Y
1 10 12
2 20 22
3 30 32")
library(data.table)
dt = as.data.table(dat)
设置好数据表后,by
可以轻松完成此操作:
dt2 = dt[, list(New_col=seq(X, Y)), by=c("X", "Y")]
# X Y New_col
# 1: 10 12 10
# 2: 10 12 11
# 3: 10 12 12
# 4: 20 22 20
# 5: 20 22 21
# 6: 20 22 22
# 7: 30 32 30
# 8: 30 32 31
# 9: 30 32 32
(唯一的免责声明是,如果原始数据框中存在重复的(X, Y)
对, 将无效