[英]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.