【问题标题】:R shifting values to the rightR 向右移动值
【发布时间】:2016-12-21 18:13:26
【问题描述】:

我认为我面临一个非常简单的问题。

示例数据:

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 东西)。我想将 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)
}

这工作得很好,期待它很慢(我可能有几百行要通过,这需要几十分钟,这并不理想)。我知道我可能用最慢的方式来做这类事情,因此我向你们提出问题。我怎样才能达到这样的结果。

提前感谢您的帮助!

【问题讨论】:

  • sel &lt;- grepl("A", df$ColumnWhereAareExpected, fixed = TRUE); df[sel, "A"] &lt;- df[sel, "ColumnWhereAareExpected")
  • 什么是df$ColumnWhereAareExpected?那些A 值是否总是出现在某个列中,或者它们可以出现在任何列中?
  • 正是你所说的:出现时,总是在同一列。在这个例子中是“y”,所以我应该说 df$y 来匹配我的例子......
  • 谢谢罗兰。可以快速选择值并将它们保存在我想要的位置,但这并不能解决我的核心问题,即左移所有值。
  • 要扩展 Rolands 评论,为了移动单元格,你可以做 df[sel, c("y", "z")] &lt;- df[sel, c("z", "aa")] (对于你的具体例子)

标签: r dataframe


【解决方案1】:

基于 cmets,以下是我如何转换函数以执行操作:

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)
}

我希望在 while 结束时重置选择,如果需要它会经历几次。它没有,所以当我调用我的函数时,我再次使用选择,如果any(sel) 为真,那么我再次调用此函数。

无论如何,它比我之前的主要意图要快得多。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多