代码之家  ›  专栏  ›  技术社区  ›  Dr. Fabian Habersack

如何提取现有变量的值并将其粘贴到数据帧的顶行(使用R)

  •  0
  • Dr. Fabian Habersack  · 技术社区  · 6 年前

    可能有一个非常简单的解决办法,但我不知道为什么。这就是我的数据(在R中)的样子(除了 value_new 这正是我所需要的:

    dat<-data.frame("id"=c(1,2,3,4,5,NA,NA,NA,NA,NA),
          "value"=c(rep(NA,5),7,NA,4,1,9),
          "value_new"=c(7,NA,4,1,9,rep(NA,5)))
    

    我希望这是不言自明的。我需要的是“价值”的价值观 is.na(value) (即前五行)并将这些值粘贴为 第一 五排(即 value<0 )一个新变量,我想称之为“value\u new”。

    做这件事的简单方法是什么?我基本上需要剪切下半部分并将其作为新变量粘贴到数据帧的顶部。希望这有意义。

    2 回复  |  直到 6 年前
        1
  •  2
  •   AntoniosK    6 年前
    dat<-data.frame("id"=c(1,2,3,4,5,NA,NA,NA,NA,NA),
                    "value"=c(rep(NA,5),7,NA,4,1,9))
    
    dat$value_new = NA
    dat$value_new[!is.na(dat$id)] = dat$value[is.na(dat$id)]
    dat
    
    #    id value value_new
    # 1   1    NA         7
    # 2   2    NA        NA
    # 3   3    NA         4
    # 4   4    NA         1
    # 5   5    NA         9
    # 6  NA     7        NA
    # 7  NA    NA        NA
    # 8  NA     4        NA
    # 9  NA     1        NA
    # 10 NA     9        NA
    

    以防有更多行具有非- NA id 相比 不适用 身份证件 您可以使用:

    dat<-data.frame("id"=c(1,2,3,4,5,6,NA,NA,NA,NA,NA),
                    "value"=c(rep(NA,6),7,NA,4,1,9))
    
    k = sum(is.na(dat$id))
    dat$value_new = NA
    dat$value_new[!is.na(dat$id)][1:k] = dat$value[is.na(dat$id)]
    dat
    
    #    id value value_new
    # 1   1    NA         7
    # 2   2    NA        NA
    # 3   3    NA         4
    # 4   4    NA         1
    # 5   5    NA         9
    # 6   6    NA        NA
    # 7  NA     7        NA
    # 8  NA    NA        NA
    # 9  NA     4        NA
    # 10 NA     1        NA
    # 11 NA     9        NA
    

    哪里 k 将在新列顶部替换的值数。

        2
  •  0
  •   Andre Elrico    6 年前
    dat<-data.frame("id"=c(1,2,3,4,5,NA,NA,NA,NA,NA),
                    "value"=c(rep(NA,5),7,NA,4,1,9),
                    "value_new"=c(7,NA,4,1,9,rep(NA,5)))
    
    ind    <- which(!is.na(dat$value))[1]
    newcol <- `length<-`(dat$value[ind:nrow(dat)], nrow(dat))
    
    dat$value_new2 <- newcol
    
    #   id value value_new value_new2
    #1   1    NA         7          7
    #2   2    NA        NA         NA
    #3   3    NA         4          4
    #4   4    NA         1          1
    #5   5    NA         9          9
    #6  NA     7        NA         NA
    #7  NA    NA        NA         NA
    #8  NA     4        NA         NA
    #9  NA     1        NA         NA
    #10 NA     9        NA         NA
    

    短版本:

    dat$value_new2 <- `length<-`(dat$value[which(!is.na(dat$value))[1]:nrow(dat)], nrow(dat))
    

    我删除了第一个连续的NA并将它们添加到末尾。不考虑身份证在这里。