使用上一个行值填充数据框

use*_*055 9 r calculated-columns dataframe

我有一个有2列的数据框.

column1在column2中的随机数是一个地方保持列,我希望column3看起来像

  random    temp
0.502423373 1
0.687594055 0
0.741883739 0
0.445364032 0
0.50626137  0.5
0.516364981 0
...
Run Code Online (Sandbox Code Playgroud)

我想填充column3所以它取最后一个非零数字(在这个例子中是1或.5)并连续用该值填充以下行,直到它遇到一个具有不同数字的行.然后它重复整个列的过程.

random     temp state
0.502423373 1   1
0.687594055 0   1
0.741883739 0   1
0.445364032 0   1
0.50626137  0.5 0.5
0.516364981 0   0.5
0.807804708 0   0.5
0.247948445 0   0.5
0.46573337  0   0.5
0.103705154 0   0.5
0.079625868 1   1
0.938928944 0   1
0.677713019 0   1
0.112231619 0   1
0.165907178 0   1
0.836195267 0   1
0.387712998 1   1
0.147737077 0   1
0.439281543 0.5 0.5
0.089013503 0   0.5
0.84174743  0   0.5
0.931738707 0   0.5
0.807955172 1   1
Run Code Online (Sandbox Code Playgroud)

感谢任何和所有的帮助

A5C*_*2T1 12

也许你可以na.locf在设置值"0"后使用"zoo"包NA.假设你data.frame被称为"mydf":

mydf$state <- mydf$temp
mydf$state[mydf$state == 0] <- NA

library(zoo)
mydf$state <- na.locf(mydf$state)
#      random temp state
# 1 0.5024234  1.0   1.0
# 2 0.6875941  0.0   1.0
# 3 0.7418837  0.0   1.0
# 4 0.4453640  0.0   1.0
# 5 0.5062614  0.5   0.5
# 6 0.5163650  0.0   0.5
Run Code Online (Sandbox Code Playgroud)

如果NA原始文件data.frame中的"temp"列中有值,并且您希望将它们保留NA在新生成的"状态"列中,则很容易处理.只需添加一行即可重新引入NA值:

mydf$state[is.na(mydf$temp)] <- NA
Run Code Online (Sandbox Code Playgroud)

  • @NealFultz,??? 我怎么知道 这不是我的数据,这些条件没有在问题中指定.我仍然猜测零旁边的"NA"应该用最后一个已知值替换,并且对于当前数据集,我不认为这会是一个问题.或者,当您遇到"NA"时,是否要继续使用"NA"填充数据?请随意分享您感知的条件以及您如何处理它.我没有看到你现在的解决方案处理'NA`值,所以我渴望学习. (3认同)

sha*_*dow 5

受@Ananda Mahto解决方案的启发,这是对内部代码的改编,na.locf它直接用于0代替NAs.然后您不需要zoo包,也不需要进行将值更改为的预处理NA.基准测试显示,这比原始版本快10倍.

locf.0 <- function(x) {
  L <- x!=0
  idx <- c(0, which(L))[cumsum(L) + 1]
  return(x[idx])
} 
mydf$state <- locf.0(mydf$temp)
Run Code Online (Sandbox Code Playgroud)