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
...
我想填充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
感谢任何和所有的帮助
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
如果NA原始文件data.frame中的"temp"列中有值,并且您希望将它们保留NA在新生成的"状态"列中,则很容易处理.只需添加一行即可重新引入NA值:
mydf$state[is.na(mydf$temp)] <- NA
受@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)
| 归档时间: | 
 | 
| 查看次数: | 5962 次 | 
| 最近记录: |