Перезаписать столбцы при объединении данных в R - PullRequest
1 голос
/ 15 октября 2019

У меня есть фрейм данных, где мне нужно было сдвинуть значения влево, если слева присутствовали NA. Чтобы сделать это, я поместил в подмножество свой фрейм данных объединение1, создав комбинезон2, и применил следующую функцию:

combine2 <- combine1 %>%
  select(ID, Col3:Col7)
combine2[] <-  t(apply(combine2, 1, function(x) c(x[!is.na(x)], x[is.na(x)])))

Я пытаюсь объединить эти два значения вместе, сохраняя смещенные значения из комбайна 2 или перезаписывая их поверхобъединить1 значения. Я просматривал функцию соединения dplyr, но я не могу найти ничего, что могло бы сделать эту работу. Есть ли способ соединить эти два вместе или, возможно, способ применить эту функцию смещения NA в исходном кадре данных без необходимости сначала выделять ее?

Это результат функции смещения NA:

combine1
# A tibble: 6 x 9
     ID Col1  Col2  Col3  Col4  Col5  Col6  Col7  Col8 
  <dbl> <chr> <chr> <chr> <chr> <chr> <lgl> <lgl> <chr>
1     1 text  text  P12-1 P14-5 NA    NA    NA    text 
2     2 text  text  P98-2 NA    P65-7 NA    NA    text 
3     3 text  text  NA    P53-1 NA    NA    NA    text 
4     4 text  text  P77-8 NA    NA    NA    NA    text 
5     5 text  text  NA    P58-1 P11-0 NA    NA    text 
6     6 text  text  NA    NA    P34-5 NA    NA    text 
combine2
# A tibble: 6 x 6
  ID    Col3  Col4  Col5  Col6  Col7 
  <chr> <chr> <chr> <chr> <chr> <chr>
1 1     P12-1 P14-5 NA    NA    NA   
2 2     P98-2 P65-7 NA    NA    NA   
3 3     P53-1 NA    NA    NA    NA   
4 4     P77-8 NA    NA    NA    NA   
5 5     P58-1 P11-0 NA    NA    NA   
6 6     P34-5 NA    NA    NA    NA   

Вот dput () из кадра данных:

structure(list(ID = c(1, 2, 3, 4, 5, 6), Col1 = c("text", "text", 
"text", "text", "text", "text"), Col2 = c("text", "text", "text", 
"text", "text", "text"), Col3 = c("P12-1", "P98-2", NA, "P77-8", 
NA, NA), Col4 = c("P14-5", NA, "P53-1", NA, "P58-1", NA), Col5 = c(NA, 
"P65-7", NA, NA, "P11-0", "P34-5"), Col6 = c(NA, NA, NA, NA, 
NA, NA), Col7 = c(NA, NA, NA, NA, NA, NA), Col8 = c("text", "text", 
"text", "text", "text", "text")), class = c("spec_tbl_df", "tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L), spec = structure(list(
    cols = list(ID = structure(list(), class = c("collector_double", 
    "collector")), Col1 = structure(list(), class = c("collector_character", 
    "collector")), Col2 = structure(list(), class = c("collector_character", 
    "collector")), Col3 = structure(list(), class = c("collector_character", 
    "collector")), Col4 = structure(list(), class = c("collector_character", 
    "collector")), Col5 = structure(list(), class = c("collector_character", 
    "collector")), Col6 = structure(list(), class = c("collector_logical", 
    "collector")), Col7 = structure(list(), class = c("collector_logical", 
    "collector")), Col8 = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1), class = "col_spec"))```

1 Ответ

1 голос
/ 15 октября 2019

Используя предоставленный вами код, вы можете заменить данные за один шаг, проиндексировав левую часть:

combine1[paste0("Col", 3:7)] <- t(apply(combine1[paste0("Col", 3:7)], 1, function(x) c(x[!is.na(x)], x[is.na(x)])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...