Превратите фрейм данных в два ряда в один - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть фрейм данных, где некоторые строки являются продолжением других других строк (дополняя друг друга), которые я хотел бы объединить в одну строку. Возьмите следующий пример

+-------+-------------+-----------+-----+---------+
| rowID | name        | address   | age | firstId |
+-------+-------------+-----------+-----+---------+
| 1     | Bert        |           | 60  |         |
+-------+-------------+-----------+-----+---------+
| 2     | Ernie       | Berlin    | 72  |         |
+-------+-------------+-----------+-----+---------+
| 3     | Bert Sesame | Amsterdam |     | 1       |
+-------+-------------+-----------+-----+---------+

3-й rowId ссылается на 1-й RowId, который, в свою очередь, сделал бы Берту 60 лет. Между тем, вторая строка не имеет firstId (строки для продолжения) и должна быть оставлена ​​как есть.

Некоторые столбцы могут быть заполнены в обеих строках, и я хотел бы взять строку, в которой заполнено поле firstID (таким образом, последняя строка). Например, третья строка будет иметь имя «Bert Sesame», в этом случае я хотел бы использовать имя «Bert Sesame», строка со значением firstId.

Конечный датафрейм будет

+-------+-------------+-----------+-----+---------+
| rowID | name        | address   | age | firstId |
+-------+-------------+-----------+-----+---------+
| 2     | Ernie       | Berlin    | 72  |         |
+-------+-------------+-----------+-----+---------+
| 3     | Bert Sesame | Amsterdam | 60  | 1       |
+-------+-------------+-----------+-----+---------+

Как мне этого добиться?

Я смотрел на такие вопросы, как этот. Объединить две строки в data.frame

Но это относится ко всем строкам, группируя их вместе. Я только хочу объединить / объединить строки, которые конкретно относятся к другим строкам.

1 Ответ

0 голосов
/ 07 ноября 2018

Вот попытка использования tidyverse.

library(tidyverse)

df %>% 
 group_by(rowID_new = replace(rowID, firstId != '', firstId[firstId != ''])) %>% 
 mutate(age = replace(age, age == '', age[age != ''])) %>% 
 ungroup() %>% 
 filter(!rowID %in% firstId) %>% 
 select(-rowID_new)

что дает,

# A tibble: 2 x 5
  rowID name  address age   firstId
  <dbl> <chr> <chr>   <chr> <chr>  
1     2 B     E       72    ""     
2     3 C     F       60    1

EDIT: Если вам нужно заполнить несколько переменных, мы можем заменить '' на NA и использовать fill, т.е.

df %>% 
 mutate_all(function(i) replace(i, i == '', NA)) %>% 
 group_by(rowID_new = replace(rowID, !is.na(firstId), firstId[!is.na(firstId)])) %>% 
 fill(-rowID, .direction = 'up') %>% #you might not need this[with .direction = 'up']
 fill(-rowID) %>% 
 ungroup() %>% 
 filter(!rowID %in% firstId)

, что дает,

# A tibble: 2 x 6
  rowID name  address age   firstId rowID_new
  <dbl> <chr> <chr>   <chr> <chr>   <chr>    
1     3 C     F       60    1       1        
2     2 B     E       72    <NA>    2

ИСПОЛЬЗОВАННЫЙ ПРИМЕР

structure(list(rowID = c(1, 2, 3), name = c("A", "B", "C"), address = c("D", 
"E", "F"), age = c("60", "72", ""), firstId = c("", "", "1")), class = "data.frame", row.names = c(NA, 
-3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...