【问题标题】:Rename column data frame sequentially按顺序重命名列数据框
【发布时间】:2014-01-22 10:23:37
【问题描述】:

我有一个这样的数据框

   x           y          z

10             10         0      
00021          21         11    
022            22         1                                         
13610206     13610206     1     
13610207     13610207     1     
13610208     13610208     1     
13610209     13610209     1     
13610210     13610210     1 

其中第二列是 y = as.numeric(as.character(x)),第三列是 z = diff(y)。 我想做的是添加这样的列

   x           y          z               xnew

10             10         0                10
00021          21         11               00021 
022            22         1                00021                                  
13610206     13610206     13610184         13610206
13610207     13610207     1                13610206
13610208     13610208     1                13610206
13610209     13610209     1                13610206
13610210     13610210     1                13610206

即如果 z=1,xnew 等于前一个 x,其中 z 不等于 1。

【问题讨论】:

  • 我不明白这个问题,你有一个带有数字的数据框,并希望在第二列中与前一个数字有差异,然后,如果差异较小,则制作第三列或等于 1 你保留以前的数字吗?
  • 不是上一个数字,而是最后一个与一个不同的数字

标签: r


【解决方案1】:

您可以在包zoo:

首先,导入数据:

dat <- read.table(text="
x           y          z
10             10         0      
00021          21         11    
022            22         1                                         
13610206     13610206     1     
13610207     13610207     1     
13610208     13610208     1     
13610209     13610209     1     
13610210     13610210     1 ", header=TRUE, colClasses=c("character", "numeric", "numeric"))

接下来,分析

library(zoo)

dat$z <- c(0, diff(dat$y))
dat$xnew <- na.locf(ifelse(dat$z==1, NA, dat$x))
dat

结果:

         x        y        z     xnew
1       10       10        0       10
2    00021       21       11    00021
3      022       22        1    00021
4 13610206 13610206 13610184 13610206
5 13610207 13610207        1 13610206
6 13610208 13610208        1 13610206
7 13610209 13610209        1 13610206
8 13610210 13610210        1 13610206

【讨论】:

    【解决方案2】:

    使用apply:

    old <- NA
    df$xnew <- apply(df, 1, function(row) {
                  if (row['z'] != "1")
                    old <<- row['x']
                  old
                })
    df
    #          x        y        z     xnew
    # 1       10       10        0       10
    # 2    00021       21       11    00021
    # 3      022       22        1    00021
    # 4 13610206 13610206 13610184 13610206
    # 5 13610207 13610207        1 13610206
    # 6 13610208 13610208        1 13610206
    # 7 13610209 13610209        1 13610206
    # 8 13610210 13610210        1 13610206
    

    【讨论】:

      【解决方案3】:

      所以你有这个:

      df
      #         x
      #1       10
      #2    00021
      #3      022
      #4 13610206
      #5 13610207
      #6 13610208
      #7 13610209
      #8 13610210
      

      您可以通过df[1,]&lt;- as.numeric(df[1,])将其转换为整数,然后开始休息值:

      z<-0
      for (i in 0:nrow(df)){
      z<-c(z,df[i+1,]-df[i,])
      df<-cbind(df, z)
      }
      

      但 Andrie 的解决方案更好,因为它不使用 for 循环,但我想指出如何管理字符串的 df 以将其转换为数字以应用它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        • 2019-11-01
        • 2012-04-28
        • 2020-10-20
        • 2015-01-24
        • 1970-01-01
        相关资源
        最近更新 更多