R - 填充空变量

时间:2017-04-11 15:41:17

标签: r dataframe

鉴于:

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

3 个答案:

答案 0 :(得分:2)

我们可以通过applyMARGIN=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=2lag函数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