【问题标题】:copy value from last row and paste in to first row r从最后一行复制值并粘贴到第一行 r
【发布时间】:2015-03-31 07:19:47
【问题描述】:

我有一个数据框。其中 col3 和 col4 中的值在错误的行中加了 1。底行值应该在顶行,顶行应该在第二行,依此类推

目前

col1 col2  col3  col4
 a    b      c     d
 e     f     g     h
 i      j    k     l

应该是

 col1 col2  col3  col4
  a    b      k     l
  e     f     c     d
   i    j     g     h

如何将 col3 和 col4 中的值向下移动,最后一个成为第一个?

【问题讨论】:

    标签: r


    【解决方案1】:

    我倾向于使用 dplyr 的 mutate_eachsummarise_each 函数将相同的函数应用于多个列。以下是您可以使用自定义“交换”函数以提高可读性的方法:

    library(dplyr)
    

    定义一个函数:

    swap <- function(x) c(last(x), head(x, -1L))
    

    现在您可以在“mutate_each”中使用此自定义函数并指定要将函数应用于的列:

    mutate_each(df, funs(swap), col3, col4)
    #  col1 col2 col3 col4
    #1    a    b    k    l
    #2    e    f    c    d
    #3    i    j    g    h
    

    如果您更喜欢 base R,您可以类似地执行此操作,使用稍微修改的函数“swap2”和“lapply”将函数应用于多个列:

    # define the function:
    swap2 <- function(x) c(tail(x, 1L), head(x, -1L))
    # define the columns you want to apply the function to:
    cols <- c("col3", "col4")
    # Finally, lapply over the data:
    df[cols] <- lapply(df[cols], swap2)
    

    数据:

    > dput(df)
    structure(list(col1 = c("a", "e", "i"), col2 = c("b", "f", "j"
    ), col3 = c("c", "g", "k"), col4 = c("d", "h", "l")), .Names = c("col1", 
    "col2", "col3", "col4"), class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

      【解决方案2】:

      假设d 是你的data.frame:

      d$col3 <- c(d$col3[length(d$col3)], d$col3[-length(d$col3)])
      d$col4 <- c(d$col4[length(d$col4)], d$col4[-length(d$col4)])
      

      【讨论】:

      • 对于问题中给出的示例数据,此代码似乎失败了。
      • @CathG 谢谢!这是一个社区网站,所以更正非常好。
      【解决方案3】:

      试试这个

      df <- data.frame(col1=c("a", "e", "i"),
                       col2=c("b", "f", "j"),
                       col3=c("c", "g", "k"),
                       col4=c("d", "h", "l"))
      
      
      df <- cbind(df[, 1:2], df[c(dim(df)[1], 1:(dim(df)[1]-1)), 3:4])
      

      【讨论】:

        【解决方案4】:

        使用字符而不是因子创建数据框:

        df <- data.frame(col1=c("a", "e", "i"),
                         col2=c("b", "f", "j"),
                         col3=c("c", "g", "k"),
                         col4=c("d", "h", "l"), stringsAsFactors=FALSE)
        
        df$col3 <- c(df$col3[nrow(df)], df$col3[1:(nrow(df)-1)])
        df$col4 <- c(df$col4[nrow(df)], df$col4[1:(nrow(df)-1)])
        

        输出:

        > df
          col1 col2 col3 col4
        1    a    b    k    l
        2    e    f    c    d
        3    i    j    g    h
        

        【讨论】:

          【解决方案5】:

          假设 df 是您的数据框,您可以使用 for 循环

          temp3 = df[nrow(df),3]
          temp4 = df[nrow(df),4]
          for(i in 2:nrow(df)){
              df[(i,3] = df[((i - 1),3]
              df[(i,4] = df[((i - 1),4]
          }
          df[1, 3] = temp3
          df[1, 4] = temp4
          

          【讨论】:

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