Последние два наблюдения, не относящиеся к АН, подряд - PullRequest
0 голосов
/ 08 октября 2019

У меня есть кадр данных, который выглядит следующим образом

    A  B  F  B  J  R  8  4

    B  A  7  5  NA NA NA NA

    C  1  9  NA NA NA NA NA

Я хочу переместить последние два наблюдения (исключая NA) в каждой строке в начало строки. Я пытался использовать subset () и пакет dplyr, но пока не смог разобраться.

Так что это должно выглядеть как

8  4  A  B  F  B  J  R

7  5  B  A  NA NA NA NA

1  9  C  NA NA NA NA NA

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Мы можем сделать это с base R, используя head и tail

df[] <- t(apply(df, 1, function(x) `length<-`(c(tail(na.omit(x), 2), 
       head(na.omit(x), -2)), length(x))))
df
#   V1 V2 V3   V4   V5   V6   V7   V8
#1  8  4  A    B    F    B    J    R
#2  7  5  B    A <NA> <NA> <NA> <NA>
#3  1  9  C <NA> <NA> <NA> <NA> <NA>

data

df <- structure(list(V1 = c("A", "B", "C"), V2 = c("B", "A", "1"), 
    V3 = c("F", "7", "9"), V4 = c("B", "5", NA), V5 = c("J", 
    NA, NA), V6 = c("R", NA, NA), V7 = c(8L, NA, NA), V8 = c(4L, 
    NA, NA)), class = "data.frame", row.names = c(NA, -3L))
0 голосов
/ 08 октября 2019

Мы можем использовать apply по строкам и расположить строку таким образом, чтобы получить индексы последних двух значений, отличных от NA, и выбрать оставшиеся индексы.

df[] <- t(apply(df, 1, function(x) {
       inds <- tail(which(!is.na(x)), 2)
       c(x[inds], x[setdiff(seq_along(x), inds)])
}))

df
#  V1 V2 V3   V4   V5   V6   V7   V8
#1  8  4  A    B    F    B    J    R
#2  7  5  B    A  <NA> <NA> <NA> <NA>
#3  1  9  C  <NA> <NA> <NA> <NA> <NA>

data

df <- structure(list(V1 = structure(1:3, .Label = c("A", "B", "C"),
class = "factor"), V2 = structure(3:1, .Label = c("1", "A", "B"), 
class = "factor"), V3 = structure(c(3L, 1L, 2L), .Label = c("7", "9", "F"), 
class = "factor"),V4 = structure(c(2L, 1L, NA), .Label = c("5", "B"), 
class = "factor"), V5 = structure(c(1L, NA, NA), .Label = "J", class = "factor"), 
V6 = structure(c(1L, NA, NA), .Label = "R", class = "factor"), 
V7 = c(8L, NA, NA), V8 = c(4L, NA, NA)), class = "data.frame", 
row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...