【问题标题】:Shifting row values for multiple columns移动多列的行值
【发布时间】:2020-11-11 15:10:23
【问题描述】:

我有以下数据框:

xR <- data.frame("A" = c(15, 13.5, 12, 9.1, NA, NA, NA, NA), 
             "B" = c(NA, 13.6, 8.4, 6.7, 5.6, 2.0, NA, NA), 
             "C" = c(NA, NA, 8.5, 2.43, 1.23, NA, NA, NA))

如何将 B 列和 C 列中的行向上移动 1 行以获得:

xR1 <- data.frame("A" = c(15, 13.5, 12, 9.1, NA, NA, NA, NA), 
             "B" = c(13.6, 8.4, 6.7, 5.6, 2.0, NA, NA, NA), 
             "C" = c(NA, 8.5, 2.43, 1.23, NA, NA, NA, NA))

我的数据框有 100 多列,因此尝试将其自动化。 感谢您的帮助

【问题讨论】:

  • 写一个函数来处理shift_1 &lt;- function(x) c(x[-1], x[1])的移动并将它应用到你的数据xR[, cols] &lt;- lapply(xR[, cols], shift_1),其中cols是一个列名的字符向量,即cols &lt;- c("B", "C")

标签: r dataframe row multiple-columns shift


【解决方案1】:

base中,您可以使用[-1] 跳过第一个元素,使用cNA 在末尾添加NA

data.frame(xR[1], lapply(xR[-1], function(x) c(x[-1], NA)))
#     A    B    C
#1 15.0 13.6   NA
#2 13.5  8.4 8.50
#3 12.0  6.7 2.43
#4  9.1  5.6 1.23
#5   NA  2.0   NA
#6   NA   NA   NA
#7   NA   NA   NA
#8   NA   NA   NA

或使用@Ricardo 的想法进行适当的修改:

xR[,-1] <- rbind(xR[-1,-1], NA)
xR
#     A    B    C
#1 15.0 13.6   NA
#2 13.5  8.4 8.50
#3 12.0  6.7 2.43
#4  9.1  5.6 1.23
#5   NA  2.0   NA
#6   NA   NA   NA
#7   NA   NA   NA
#8   NA   NA   NA

或仅使用子设置:

xR[,-1] <- xR[seq_len(nrow(xR)) + 1, -1]

【讨论】:

  • 除了这个@GKi- 是否可以将 col B 上移 1 行,将 col C 上移 2 行等等?谢谢
  • 试试:xR[,-1] &lt;- lapply(seq_len(ncol(xR)-1), function(i) c(xR[-seq_len(i),i+1], rep(NA, i)))
  • 最后一个问题@GKi - 是否可以移动 Col B 中的值,以便它从 Col B 的第一个值低于 Col A 的 Col A 的同一行开始?希望这是有道理的。如果没有,我将创建一个示例 - 谢谢
  • 也许吧? i &lt;- which.max(!is.na(xR$B)); i &lt;- i-which.max(xR$B[i] &lt; xR$A); if(i &gt; 0) c(xR$B[-seq_len(i)], rep(NA, i)) else xR$B
  • 谢谢@GKi - 这不起作用 - 我已将其作为一个单独的问题提出,因为我认为它有助于更​​好地解释它 - 再次感谢您的帮助
【解决方案2】:

使用基础 R:

xR[,2:3] = rbind(xR[-1,2:3], NA)

然后您可以将2:3 更改为您想要的所有列。

【讨论】:

    【解决方案3】:
    library(tidyverse)
    xR1 <- xR %>%
      mutate(B = lead(B),
             C = lead(C))
    

    给出:

         A    B    C
    1 15.0 13.6   NA
    2 13.5  8.4 8.50
    3 12.0  6.7 2.43
    4  9.1  5.6 1.23
    5   NA  2.0   NA
    6   NA   NA   NA
    7   NA   NA   NA
    8   NA   NA   NA
    

    跨多列自动化(假设您不想为 A 列移动)非常容易:

    xR1 <- xR %>%
      mutate(across(-A, lead))
    

    【讨论】:

    • 谢谢@deschen,但我有很多专栏,所以不知道如何为每一列做。谢谢
    【解决方案4】:

    您可以使用多种列自动执行此操作

    xR %>% 
      dplyr::mutate_at(.vars = vars(B:C),
                       .funs = ~ dplyr::lead(.x, 1))
    

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多