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)
受@Ananda Mahto解决方案的启发,这是对内部代码的改编,na.locf
它直接用于0
代替NA
s.然后您不需要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)
归档时间: |
|
查看次数: |
5962 次 |
最近记录: |