Как условно добавить строку фрейма данных к одному выше - PullRequest
2 голосов
/ 28 мая 2019

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

   ID       Date  Period Account                      Amount1 Amount2             
  <chr>    <chr> <chr>  <chr>                        <chr> <chr>                    
1 76311099 43494 /1     P / ABC / 123456             NA    3116362               
2 NA       NA    NA     C100ST                       NA    NA                         
3 66112599 37135 /26    S / ADR                      NA    1246880.3900000001       
4 NA       NA    NA     65101599 / S0                NA    NA                          
5 45461599 37155 /O6    B / INR / REVERSE            NA    623440.19000000006     
6 NA       NA    NA     UNDO / S0                    NA    NA                
7 69876599 37134 /O3    N / ABC                   401.63   NA        
8 19991099 37122 /O5    P / PDA / ASK 4265        401.65   NA   
9 NA       NA    NA     AT045BT                      NA    NA   

Я изо всех сил пытался сделать это, но ничего, что я пробовал, не сработало В основном, я хочу сделать, если значение ID строки равно NA, я хочу добавить текст в столбце Account к строке выше, а затем удалить его.

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

   ID      Date  Period Account                      Amount1 Amount2             
  <chr>    <chr> <chr>  <chr>                        <chr> <chr>                    
1 76311099 43494 /1     P / ABC / 123456 / C100ST     NA    3116362                                     
2 66112599 37135 /26    S / ADR / 65101599 / S0       NA    1246880.3900000001                       
3 45461599 37155 /O6    B / INR / REVERSE / UNDO / S0 NA    623440.19000000006                
4 69876599 37134 /O3    N / ABC                       401.63   NA        
5 19991099 37122 /O5    P / PDA / ASK 4265 / AT045BT  401.65   NA       

Как видите, строка со значением ID 69876599 остается такой же, как не было другой строки сразу под ней со значением NA для ID.

Кто-нибудь знает способ справиться с этим?

Ответы [ 2 ]

6 голосов
/ 28 мая 2019

Можно выбрать fill выбранный столбец, чтобы изменить NA с предыдущим элементом, не являющимся NA, сгруппированным по этим столбцам, свернуть «Account», объединяя элементы в одну строку, затем summarise остальные столбцы «Количество», чтобы получить первый элемент, отличный от NA

library(tidyverse)
df1 %>%
   fill(ID, Date, Period) %>%
   group_by(ID, Date, Period) %>%
   group_by(Account = str_c(Account, collapse = ' / '), add = TRUE) %>%
   summarise_all(list(~ .[which(!is.na(.))[1]]))
# A tibble: 5 x 6
# Groups:   ID, Date, Period [5]
#        ID  Date Period Account                       Amount1  Amount2
#     <int> <int> <chr>  <chr>                           <dbl>    <dbl>
#1 19991099 37122 /O5    P / PDA / ASK 4265 / AT045BT     402.      NA 
#2 45461599 37155 /O6    B / INR / REVERSE / UNDO / S0     NA   623440.
#3 66112599 37135 /26    S / ADR / 65101599 / S0           NA  1246880.
#4 69876599 37134 /O3    N / ABC                          402.      NA 
#5 76311099 43494 /1     P / ABC / 123456 / C100ST         NA  3116362 

data

df1 <- structure(list(ID = c(76311099L, NA, 66112599L, NA, 45461599L, 
NA, 69876599L, 19991099L, NA), Date = c(43494L, NA, 37135L, NA, 
37155L, NA, 37134L, 37122L, NA), Period = c("/1", NA, "/26", 
NA, "/O6", NA, "/O3", "/O5", NA), Account = c("P / ABC / 123456", 
"C100ST", "S / ADR", "65101599 / S0", "B / INR / REVERSE", "UNDO / S0", 
"N / ABC", "P / PDA / ASK 4265", "AT045BT"), Amount1 = c(NA, 
NA, NA, NA, NA, NA, 401.63, 401.65, NA), Amount2 = c(3116362, 
NA, 1246880.39, NA, 623440.19, NA, NA, NA, NA)), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"))
0 голосов
/ 28 мая 2019

Для решения base-R ...

Пусть d = ваш фрейм данных,

i <- which(is.na(d[,1]))
d[i-1,"Account"] <- paste(d[i-1,"Account"],d[i,"Account"])
d <- d[-i,] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...