R将值移到右侧

时间:2016-12-19 10:06:12

标签: r dataframe

我相信我面临一个非常简单的问题。

示例数据:

example=data.frame(x=c(1,2,3,4,5,6,7,8), y=c(1,2,3,X,X,X,7,8), z=c(1,2,3,4,5,6,7,8))

看起来像这样:

    x   y   z
1   1   1   1
2   2   2   2
3   3   3   3
4   4   4   4
5   5   5   5
6   6   6   6
7   7   7   7
8   8   8   8

这是理想的情况。因为我的数据是单列格式,我将其格式化为这样的数据帧。现在有时(不是在每个观察中)都有一个额外的值总是在同一个地方(例如,在将它格式化为DF后总是在同一列中)。

看起来像这样:

data.frame(x=c("X1","X2","X3","X4","X5","X6","X7","X8"), 
y=c("Y1","Y2","Y3","A38","A15","A8","Y7","Y8"), 
z=c("Z1","Z2","Z3","Y4","Y5","Y6","Z7","Z8"), 
aa=c(NA,NA,NA,"Z4","Z5","Z6",NA,NA))

导致:

   x   y  z   aa
1 X1  Y1 Z1 <NA>
2 X2  Y2 Z2 <NA>
3 X3  Y3 Z3 <NA>
4 X4 A38 Y4   Z4
5 X5 A15 Y5   Z5
6 X6  A8 Y6   Z6
7 X7  Y7 Z7 <NA>
8 X8  Y8 Z8 <NA>

首先创建了“aa”列,因为我在原始单列格式文件中有一个附加值(A something)。我想在其列中保存A值(例如总是以A开头),我并不真正关心“aa”。我只想转移所有这些值:

   x  y  z   aa    A
1 X1 Y1 Z1 <NA> <NA>
2 X2 Y2 Z2 <NA> <NA>
3 X3 Y3 Z3 <NA> <NA>
4 X4 Y4 Z4   Z4  A38
5 X5 Y5 Z5   Z5  A15
6 X6 Y6 Z6   Z6   A8
7 X7 Y7 Z7 <NA> <NA>
8 X8 Y8 Z8 <NA> <NA>

为了示例,我在这里添加了几个列,但实际情况可能有多达300列,所以几乎可以将这些值向左移动到我们在其中找到NA的点行。

到目前为止,我使用此代码解决了这类问题:

format_A_things <-  function(df, col) {
  x <<- grep("A", df$ColumnWhereAareExpected) #selecting lines starting with an A
  if (length(x) > 0){
    for (i in x){
      df[i,"SpecificColumnforA"] = df[i,col]
      for (j in col:(ncol(df)-2)){
        if (is.na(df[i,j]) | is.na(df[i,j+1])){
          df[i,j] = NA
        } else {
          df[i,j] = df[i,j+1]
        }
      }
    }
  }
  return(df)
}

这很好,期待它很慢(我可能有几百行要经过,而且需要几十分钟,这并不理想)。我知道我可能用最慢的方式来做这类事情,因此我向你们提问。我如何实现这样的结果。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

基于评论,以下是我如何转换我的函数来执行操作:

var Keycloak = require('keycloak-js');
var kc = Keycloak('./keycloak.json');

kc.init().success(function(authenticated) {

   alert(JSON.stringify(kc.tokenParsed)); 

}).error(function() {
            alert('failed to initialize');
});

我希望随着时间的推移并在结束时重置选择,如果需要,它会经历几次。它没有,所以当我调用我的函数时,我再次使用选择,如果countString <- function(df, col, str) { sel <<- grepl(str, df[,col], fixed = TRUE) while (any(sel)){ df[sel,"Column"] = df[sel,"Column"] + 1 df[sel, c(col:(ncol(df)-2))] <- df[sel, c(col+1:(ncol(df)-3))] sel <<- grepl(str, df[,col], fixed = TRUE) } return(df) } 为真,那么我再次调用这个函数。

无论如何,它比我以前的方法快得多,这是我们的主要目的。

感谢大家的帮助。