【问题标题】:How to transform a dataframe so values move one row down per column in R?如何转换数据框,使值在 R 中每列向下移动一行?
【发布时间】:2021-07-15 21:26:58
【问题描述】:

我有一个数据框,其中数据是这样排序的:


df <- data.frame('a'= c('b'), 'c'=c('d'), 'e'= c('f'), 'g'= c('h'), 'i'=c('j'))

df
#   a c e g i
# 1 b d f h j

有没有一种方法可以转换数据框,以便数据每列向下移动一行(线性)?除了值保持在原处的第一行:

df_expected <- data.frame('a'= c('b', '','','',''), 'c'=c('','d','','',''), 'e'= c('', '', 'f', '',''), 'g'= c('','','','h',''), 'i'=c('','','','','j'))

df_expected

#   a c e g i
# 1 b        
# 2   d      
# 3     f    
# 4       h  
# 5         j

【问题讨论】:

  • df 是否可以有不止一行?如果是这样,你能举一个例子和预期的输出吗?

标签: r dataframe transform


【解决方案1】:

我们可以使用diag

m1 <- diag(ncol(df))
m1[m1 == 1] <- unlist(df)
as.data.frame(m1)

或者创建一个matrix

m2 <- matrix('', ncol = ncol(df), nrow = ncol(df),
     dimnames = list(NULL, names(df)))
m2[upper.tri(m2) == lower.tri(m2)] <- unlist(df)

【讨论】:

    【解决方案2】:

    对于您的特定数据框,使用diag() 要容易得多。以下代码在一般情况下应该可以工作。

    df_expected <- matrix(0, ncol = ncol(df), nrow = nrow(df) + ncol(df) - 1)
    df_expected[1:length(df[,1]),1] <- df[,1]
    for(i in 2:ncol(df)){
      tmp <- c(rep(0, i-1), df[, i])
      df_expected[1:i,i] <- tmp
    }
    df_expected <- as.data.frame(df_expected)
    names(df_expected) <- names(df)
    
    

    【讨论】:

      【解决方案3】:

      你可以试试

      `diag<-`(matrix("", length(df), length(df)), unlist(df))
      

      replace(u <- `diag<-`(diag(length(df)), unlist(df)), u == "0", "")
      

      给了

           [,1] [,2] [,3] [,4] [,5]
      [1,] "b"  ""   ""   ""   ""
      [2,] ""   "d"  ""   ""   ""
      [3,] ""   ""   "f"  ""   ""
      [4,] ""   ""   ""   "h"  ""
      [5,] ""   ""   ""   ""   "j"
      

      【讨论】:

        猜你喜欢
        • 2020-12-01
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        • 2018-08-07
        • 1970-01-01
        • 2019-08-27
        相关资源
        最近更新 更多