Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据数据框列创建多个序列_R - Fatal编程技术网

R 根据数据框列创建多个序列

R 根据数据框列创建多个序列,r,R,从数据开始,用1填充所需序列的开头,我需要用序列填充NA行。以下是起始数据(前两列)和所需的第三列: 我可以通过下面的循环来实现这一点,但是什么是更好的R编程方式呢 for(i in 1:length(df2$col2)) { df2$col3[i] <- ifelse(df2$col2[i] == 1, 1, df2$col3[i - 1] + 1) if(is.na(df2$col2[i])) df2$col3[i] <- df2$col3[i - 1] + 1 }

从数据开始,用1填充所需序列的开头,我需要用序列填充NA行。以下是起始数据(前两列)和所需的第三列:

我可以通过下面的循环来实现这一点,但是什么是更好的R编程方式呢

for(i in 1:length(df2$col2)) {
  df2$col3[i] <- ifelse(df2$col2[i] == 1, 1, df2$col3[i - 1] + 1)
  if(is.na(df2$col2[i])) df2$col3[i] <- df2$col3[i - 1] + 1
}
尝试:

库(data.table)

df2您可以使用
ave
seq_沿着
使用
cumsum
进行分组

df2$col3 <- ave(integer(nrow(df2)), cumsum(!is.na(df2$col2)), FUN=seq_along)
df2
#        col1 col2 col3
#1  478.69000    1    1
#2  320.45000   NA    2
#3  503.70000    1    1
#4  609.30000   NA    2
#5  478.19000   NA    3
#6  478.69000    1    1
#7  320.45000   NA    2
#8  503.70000    1    1
#9  609.30000   NA    2
#10 478.19000   NA    3
#11 419.63368   NA    4
#12 552.93998   NA    5
#13 785.11939    1    1
#14  18.25427   NA    2
#15  98.64697   NA    3
#16 132.58726   NA    4
#17 697.11955   NA    5
#18 512.56037   NA    6
#19 916.42520   NA    7
#20  14.33851   NA    8

df2$col3这不是你提出的同一个问题吗?我有多条消息说这篇文章不起作用,所以我认为它消失了,于是我重复了一遍。似乎这是在一次维护大修期间。所以,是的,对不起。但是你的答案采用了不同的方法,所以保留这两个帖子会更好吗?
library(data.table)                                                                                                                                         
df2 <- data.table(df2)
df2[, col3 := col2[1] + 1 * (1:.N - 1), by = .(cumsum(!is.na(col2)))]
df2$col3 <- ave(integer(nrow(df2)), cumsum(!is.na(df2$col2)), FUN=seq_along)
df2
#        col1 col2 col3
#1  478.69000    1    1
#2  320.45000   NA    2
#3  503.70000    1    1
#4  609.30000   NA    2
#5  478.19000   NA    3
#6  478.69000    1    1
#7  320.45000   NA    2
#8  503.70000    1    1
#9  609.30000   NA    2
#10 478.19000   NA    3
#11 419.63368   NA    4
#12 552.93998   NA    5
#13 785.11939    1    1
#14  18.25427   NA    2
#15  98.64697   NA    3
#16 132.58726   NA    4
#17 697.11955   NA    5
#18 512.56037   NA    6
#19 916.42520   NA    7
#20  14.33851   NA    8