鉴于:
from tkinter import *
class application:
def __init__(self,parent):
self.parent = parent
startContainer = Frame(parent)
startContainer.pack()
self.lbl = Label(startContainer,text="Please choose from the following: \nFaith Points (F) \nBanqueting Goods (B) \nEnter Honour (E) ")
self.lbl.pack()
self.btn1 = Button(startContainer,text="Votes", command=self.votes).pack()
self.btn2 = Button(startContainer,text="Gold Tithe",command=self.gold(startContainer)).pack()
def votes(self):
print("test")
self.parent.destroy()
def gold(self, parent):
pass
window = Tk()
app = application(window)
window.mainloop()
如何在v1 <- c(1,NA,1,NA,NA)
v2 <- c(NA,NA,1,NA,1)
df <- data.frame(rbind(v1, v2))
R> df
X1 X2 X3 X4 X5
1 NA 1 NA NA
NA NA 1 NA 1
?
'NA'
所以它看起来像这样:
1
答案 0 :(得分:2)
我们可以通过apply
与MARGIN=1
循环来完成此操作。找到第一个和最后一个非NA元素的索引,并使用第一个非NA元素更改其间的元素,转置输出并将其分配回数据集。
df[] <- t(apply(df, 1, function(x) {
st <- range(which(!is.na(x)))
x[st[1]:st[2]] <- x[st[1]]
x}))
答案 1 :(得分:2)
使用apply
中的MARGIN=2
和lag
函数lead
dplyr
上的另一个library(dplyr)
v1 <- c(1,NA,1,NA,NA)
v2 <- c(NA,NA,1,NA,1)
dff <- data.frame(rbind(v1, v2))
apply(t(dff), 2, function(x) {
conds <- rowSums(cbind(x, lag(x), lead(x)), na.rm = T)==2
x[conds] <- 1
x
}) %>% t()
解决方案:
# X1 X2 X3 X4 X5
# v1 1 1 1 NA NA
# v2 NA NA 1 1 1
输出:
ionic-cli
答案 2 :(得分:1)
我不知道您的数据集有多大,但您可以采用更长的方法,并使用以下任一方法获得更高效的结果:
选项1:使用arr.ind
。
library(data.table)
myFun1 <- function(indf) {
M <- as.matrix(data.table(which(indf == 1, arr.ind = TRUE))[
, list(col = seq.int(min(col), max(col))), row])
indf[M] <- 1
indf
}
myFun1(df)
选项2:使用max.col
。
myFun2 <- function(indf) {
indf2 <- replace(indf, is.na(indf), 0)
mins <- max.col(indf2, "first")
maxs <- max.col(indf2, "last")
L <- Map(seq.int, mins, maxs)
mat <- cbind(rep(seq_along(L), lengths(L)), unlist(L, use.names = FALSE))
indf[mat] <- 1
indf
}
myFun2(df)
使用不同大小的数据进行测试。这是制作数据的一种方法:
set.seed(1)
nc <- 50
nr <- 10000
df <- data.frame(t(replicate(nr, sample(c(1, 1, rep(NA, nc-2))))))
有关示例输出和时序比较,请参阅this Gist。