繁体   English   中英

如何在 R 中反转 data.frame 或 data.table 的行

[英]How to reverse rows of a data.frame or data.table in R

如何反转行的顺序,使最后一个值成为第二个值,倒数第二个值成为第三个值,等等? 第一列 ( ID ) 应该留在同一个地方。 行中的缺失值不应包含在冲销中。

以最后一行为例,最后一个值“67”被移动到第二列(一)的最后一行。 倒数第二个值“68”被移动到第三列(二)的最后一行。

原来的:

structure(list(ID = c("a", "b", "c", "d", "e", "f", "g", "h", 
"i", "j", "k", "l"), one = c(1, 2, 4, 7, 11, 16, 22, 29, 37, 
46, 56, 67), two = c(NA, 3, 5, 8, 12, 17, 23, 30, 38, 47, 57, 
68), three = c(NA, NA, 6, 9, 13, 18, 24, 31, 39, 48, 58, 69), 
    four = c(NA, NA, NA, 10, 14, 19, 25, 32, 40, 49, 59, 70), 
    five = c(NA, NA, NA, NA, 15, 20, 26, 33, 41, 50, 60, 71), 
    six = c(NA, NA, NA, NA, NA, 21, 27, 34, 42, 51, 61, 72), 
    seven = c(NA, NA, NA, NA, NA, NA, 28, 35, 43, 52, 62, 73), 
    eight = c(NA, NA, NA, NA, NA, NA, NA, 36, 44, 53, 63, 74), 
    nine = c(NA, NA, NA, NA, NA, NA, NA, NA, 45, 54, 64, 75), 
    ten = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 55, 65, 76), 
    eleven = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 66, 77
    ), twelve = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    78)), row.names = c(NA, -12L), class = c("tbl_df", "tbl", 
"data.frame"))

结果:

structure(list(ID = c("a", "b", "c", "d", "e", "f", "g", "h", 
"i", "j", "k", "l"), one = c(1, 3, 6, 10, 15, 21, 28, 36, 45, 
55, 66, 78), two = c(NA, 2, 5, 9, 14, 20, 27, 35, 44, 54, 65, 
77), three = c(NA, NA, 4, 8, 13, 19, 26, 34, 43, 53, 64, 76), 
    four = c(NA, NA, NA, 7, 12, 18, 25, 33, 42, 52, 63, 75), 
    five = c(NA, NA, NA, NA, 11, 17, 24, 32, 41, 51, 62, 74), 
    six = c(NA, NA, NA, NA, NA, 16, 23, 31, 40, 50, 61, 73), 
    seven = c(NA, NA, NA, NA, NA, NA, 22, 30, 39, 49, 60, 72), 
    eight = c(NA, NA, NA, NA, NA, NA, NA, 29, 38, 48, 59, 71), 
    nine = c(NA, NA, NA, NA, NA, NA, NA, NA, 37, 47, 58, 70), 
    ten = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 46, 57, 69), 
    eleven = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 56, 68
    ), twelve = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    67)), row.names = c(NA, -12L), class = c("tbl_df", "tbl", 
"data.frame"))

我们可以使用逐行apply并反转每行中的非 NA 值。

df[-1] <- t(apply(df[-1], 1, function(x) {x[!is.na(x)] <- rev(x[!is.na(x)]);x}))

我们可以使用tidyverse

library(dplyr)
library(purrr)
df1 %>%
    pivot_longer(cols = -ID) %>% 
    group_by(ID) %>%
    mutate(value = replace(value, !is.na(value), rev(value[!is.na(value)]))) %>% 
    ungroup %>% 
    pivot_wider(names_from = name, values_from = value)
# A tibble: 12 x 13
#   ID      one   two three  four  five   six seven eight  nine   ten eleven twelve
#   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>
# 1 a         1    NA    NA    NA    NA    NA    NA    NA    NA    NA     NA     NA
# 2 b         3     2    NA    NA    NA    NA    NA    NA    NA    NA     NA     NA
# 3 c         6     5     4    NA    NA    NA    NA    NA    NA    NA     NA     NA
# 4 d        10     9     8     7    NA    NA    NA    NA    NA    NA     NA     NA
# 5 e        15    14    13    12    11    NA    NA    NA    NA    NA     NA     NA
# 6 f        21    20    19    18    17    16    NA    NA    NA    NA     NA     NA
# 7 g        28    27    26    25    24    23    22    NA    NA    NA     NA     NA
# 8 h        36    35    34    33    32    31    30    29    NA    NA     NA     NA
# 9 i        45    44    43    42    41    40    39    38    37    NA     NA     NA
#10 j        55    54    53    52    51    50    49    48    47    46     NA     NA
#11 k        66    65    64    63    62    61    60    59    58    57     56     NA
#12 l        78    77    76    75    74    73    72    71    70    69     68     67

如何反转行的顺序,使最后一个值成为第二个值,倒数第二个值成为第三个值,依此类推? 第一列 ( ID ) 应保留在同一位置。 行中的缺失值不应包含在冲销中。

以最后一行为例,最后一个值“67”被移动到第二列(一)的最后一行。 倒数第二个值“68”被移动到第三列(两个)的最后一行。

原来的:

structure(list(ID = c("a", "b", "c", "d", "e", "f", "g", "h", 
"i", "j", "k", "l"), one = c(1, 2, 4, 7, 11, 16, 22, 29, 37, 
46, 56, 67), two = c(NA, 3, 5, 8, 12, 17, 23, 30, 38, 47, 57, 
68), three = c(NA, NA, 6, 9, 13, 18, 24, 31, 39, 48, 58, 69), 
    four = c(NA, NA, NA, 10, 14, 19, 25, 32, 40, 49, 59, 70), 
    five = c(NA, NA, NA, NA, 15, 20, 26, 33, 41, 50, 60, 71), 
    six = c(NA, NA, NA, NA, NA, 21, 27, 34, 42, 51, 61, 72), 
    seven = c(NA, NA, NA, NA, NA, NA, 28, 35, 43, 52, 62, 73), 
    eight = c(NA, NA, NA, NA, NA, NA, NA, 36, 44, 53, 63, 74), 
    nine = c(NA, NA, NA, NA, NA, NA, NA, NA, 45, 54, 64, 75), 
    ten = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 55, 65, 76), 
    eleven = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 66, 77
    ), twelve = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    78)), row.names = c(NA, -12L), class = c("tbl_df", "tbl", 
"data.frame"))

结果:

structure(list(ID = c("a", "b", "c", "d", "e", "f", "g", "h", 
"i", "j", "k", "l"), one = c(1, 3, 6, 10, 15, 21, 28, 36, 45, 
55, 66, 78), two = c(NA, 2, 5, 9, 14, 20, 27, 35, 44, 54, 65, 
77), three = c(NA, NA, 4, 8, 13, 19, 26, 34, 43, 53, 64, 76), 
    four = c(NA, NA, NA, 7, 12, 18, 25, 33, 42, 52, 63, 75), 
    five = c(NA, NA, NA, NA, 11, 17, 24, 32, 41, 51, 62, 74), 
    six = c(NA, NA, NA, NA, NA, 16, 23, 31, 40, 50, 61, 73), 
    seven = c(NA, NA, NA, NA, NA, NA, 22, 30, 39, 49, 60, 72), 
    eight = c(NA, NA, NA, NA, NA, NA, NA, 29, 38, 48, 59, 71), 
    nine = c(NA, NA, NA, NA, NA, NA, NA, NA, 37, 47, 58, 70), 
    ten = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 46, 57, 69), 
    eleven = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 56, 68
    ), twelve = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    67)), row.names = c(NA, -12L), class = c("tbl_df", "tbl", 
"data.frame"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM