首页 > 解决方案 > 将选择列向右移动一并用行号替换空格 - 1

问题描述

我有一个看起来与此类似的数据框(我已经剪掉了一些以便于参考,数据有 93 行):

                 Rank                      1     A      B      C    D
                 34                     (TPE)    2      4      6    12
                 35                     (TUR)    2      2      9    13
                 36                     (GRE)    2      1      1     4
              (UGA)                         2    1      1      4   <NA>

我需要让列对齐,但“Rank”中的一些数据偏移到左侧一列。我已将存在此问题的行分配给一个向量: off.set.rows <- c(which(is.na(df[ , 6]))) 我需要让该向量中的所有行向右移动一列并将它在第 1 列中留下的空白空间替换为它之前行中第 1 列中的数字。它应该如下所示:

                 Rank                      1     A      B      C    D
                 34                     (TPE)    2      4      6    12
                 35                     (TUR)    2      2      9    13
                 36                     (GRE)    2      1      1     4
                 36                     (UGA)    2      1      1     4   

我试过这个:df[off.set.rows, 1:(ncol(df))] <- df[off.set.rows, 2:(ncol(df))],但它会改变行中的所有内容离开一列并且 (UGA) 消失,它移动到第 5 列,然后在第 6 列中重复移动到第 2 列的值,如下所示:

                 Rank                      1     A      B      C    D
                 34                     (TPE)    2      4      6    12
                 35                     (TUR)    2      2      9    13
                 36                     (GRE)    2      1      1     4
                 2                         1     1      4     <NA>   2

非常感谢您的帮助!

标签: r

解决方案


Base R 解决方案:它是如何工作的:

  1. df仅对那些满足您定义的条件的行进行子集off.set.rows
  2. 在开头添加一个新列x
  3. 将列名粘贴dfx
  4. df将和的行绑定x在一起
  5. 删除符合您定义的条件的行off.set.rows
  6. 用于lag()将上面的值添加到Rank
off.set.rows <- c(which(is.na(df[ , 6])))

x <- subset(df, rownames(df) %in% off.set.rows)
x <- cbind(new=0, x)
colnames(x) <- colnames(df)
df <- rbind(df, x[1:6])
df <- subset(df, !rownames(df) %in% off.set.rows)
df$Rank <- ifelse(df$Rank==0, lag(df$Rank), df$Rank)
   Rank    X1 A B C  D
1    34 (TPE) 2 4 6 12
2    35 (TUR) 2 2 9 13
3    36 (GRE) 2 1 1  4
41   36 (UGA) 2 1 1  4

数据:

df <- structure(list(Rank = c("34", "35", "36", "(UGA)"), X1 = c("(TPE)", 
"(TUR)", "(GRE)", "2"), A = c(2L, 2L, 2L, 1L), B = c(4L, 2L, 
1L, 1L), C = c(6L, 9L, 1L, 4L), D = c(12L, 13L, 4L, NA)), class = "data.frame", row.names = c(NA, 
-4L))

推荐阅读