【发布时间】:2019-05-15 18:19:21
【问题描述】:
我有一个这样的数据集:
set.seed(71)
dat <- data.table(region = rep(c('A','B'), each=10),
place = rep(c('C','D'), 10),
start = sample.int(5, 20, replace = TRUE),
end = sample.int(10, 20, replace = TRUE),
count = sample.int(50, 20, replace = TRUE),
para1 = rnorm(20,3,1),
para2 = rnorm(20,4,1))
我想遍历这些数据以有条件地生成另一个包含以下列的表: 区域、地点、开始、结束、计数、计数0 dat 中的每一行可能不止一行。 在新表中,将从 dat 中复制 region、place 和 start 列的数据,并生成 end、count 和 count0 列的数据。
以下是遍历每一行 dat 的规则:
end = end +1
if (count=0) {
count0=0
} else {
count0=start*para1 + end*para2
}
if (count0>count) {
count0=count
}
count = count -count0
我尝试使用 for 循环、if 语句和 mutate 的组合,但无法正确使用。
我希望在通过前两行 dat 后得到这样的表:
region place start end count count0
A C 2 7 6.01673062 17.98326938
A C 2 8 0 6.01673062
A D 3 2 5.34392419 7.65607581
A D 3 3 0 5.34392419
the first two rows of dat I have are:
region place start end count para1 para2
A C 2 6 24 0.39412969 2.45643
A D 3 1 13 0.64372127 2.862456
【问题讨论】:
-
我从您的伪代码中不明白“dat 中的每一行可能有多行”。是什么决定了单行中是否存在多行?
-
注意事项:如果您检查的是布尔值(T/F 类似于 if 语句),您应该使用
==,而不是=。 -
函数调用count0=startpara1 + endpara2生成一个值,该值将与count变量中的值进行比较。如果它小于count,将生成一个新行并将新函数值与count值的其余部分进行比较。这个过程一直持续到 count 的值变为零。所以如果计数值很大,它可能是很多行。
标签: r