Вставка значений из разных столбцов и разных строк в новый df в R - PullRequest
2 голосов
/ 20 марта 2019

У меня есть следующий df ниже:

 name name..2 IGD
1 yaaA    recF  16
2 recF    yaaB  18
3 yaaD    yaaE  22
4  dck     dgk  -3
5 dnaX    yaaK  24
6 yaaK    recR  15
7  recR    yaaL  18
8  xpaC    yaaN  19
9  yaaO     tmk  -3
10 yaaQ    yaaR  13
11 yaaR    holB  12
12 holB    yaaT   3
13 yaaT    yabA  15
14 yabB    yazA -13
15 yazA    yabC -25

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

1 yaaA recF
2 yaaD
3 dck
4 dnaX yaaK recR
5 xpaC
6 yaaO
7 yaaQ yaaR holB yaaT
8 yabB yazA

Есть ли функция r, которую я могу использовать для этого? Я попытался выполнить поиск SO, но пока не нашел решения этой проблемы. Заранее спасибо за помощь.

Ответы [ 4 ]

3 голосов
/ 20 марта 2019

Логика похожа на @ Вэнь-Бен здесь, dplyr способ сделать это

library(dplyr)

df %>%
  group_by(group = cumsum(name != lag(name2, default = TRUE))) %>%
  summarise(name = toString(name))

#  group name                  
#  <int> <chr>                 
#1     1 yaaA, recF            
#2     2 yaaD                  
#3     3 dck                   
#4     4 dnaX, yaaK, recR      
#5     5 xpaC                  
#6     6 yaaO                  
#7     7 yaaQ, yaaR, holB, yaaT
#8     8 yabB, yazA     

Основная идея заключается в создании группирующей переменной, которая увеличивается каждый раз name != name2.

2 голосов
/ 20 марта 2019

Здесь представлен другой вариант для определения clusters в igraph

library(igraph)
library(tidyverse)
df %>%
    select(-IGD) %>%
    graph_from_data_frame() %>%
    clusters() %>%
    magrittr::extract2(1) %>%
    split(., .) %>%
    map_dfr(~tibble(x = toString(names(.x)[-length(.x)])))
## A tibble: 8 x 1
#  x
#  <chr>
#1 yaaA, recF
#2 yaaD
#3 dck
#4 dnaX, yaaK, recR
#5 xpaC
#6 yaaO
#7 yaaQ, yaaR, holB, yaaT
#8 yabB, yazA

. Идея состоит в том, чтобы создать igraph из df[c("name", "name..2")], а затем идентифицировать кластеры связанных узлов.Кластеры - это группы, и все, что нам нужно сделать, это удалить последний элемент (узел).


Пример данных

df <- read.table(text =
    " name name..2 IGD
1 yaaA    recF  16
2 recF    yaaB  18
3 yaaD    yaaE  22
4  dck     dgk  -3
5 dnaX    yaaK  24
6 yaaK    recR  15
7  recR    yaaL  18
8  xpaC    yaaN  19
9  yaaO     tmk  -3
10 yaaQ    yaaR  13
11 yaaR    holB  12
12 holB    yaaT   3
13 yaaT    yabA  15
14 yabB    yazA -13
15 yazA    yabC -25", header = T)
2 голосов
/ 20 марта 2019

В Base R мы с помощью tail head и cumsum создаем ключ группы, затем с помощью aggregate

df$id=cumsum(c(TRUE, tail(df$name,-1) != head(df$name2,-1)))

output=aggregate(name ~ id, data = df, toString)
output
  id                   name
1  1             yaaA, recF
2  2                   yaaD
3  3                    dck
4  4       dnaX, yaaK, recR
5  5                   xpaC
6  6                   yaaO
7  7 yaaQ, yaaR, holB, yaaT
8  8             yabB, yazA
0 голосов
/ 20 марта 2019

Мы можем сделать это также в data.table

library(data.table)
setDT(df)[, .(name = toString(name)), 
      .(group = cumsum(name != shift(name2, fill = TRUE)))]
#   group                   name
#1:     1             yaaA, recF
#2:     2                   yaaD
#3:     3                    dck
#4:     4       dnaX, yaaK, recR
#5:     5                   xpaC
#6:     6                   yaaO
#7:     7 yaaQ, yaaR, holB, yaaT
#8:     8             yabB, yazA

data

df <- structure(list(name = c("yaaA", "recF", "yaaD", "dck", "dnaX", 
"yaaK", "recR", "xpaC", "yaaO", "yaaQ", "yaaR", "holB", "yaaT", 
"yabB", "yazA"), name2 = c("recF", "yaaB", "yaaE", "dgk", "yaaK", 
"recR", "yaaL", "yaaN", "tmk", "yaaR", "holB", "yaaT", "yabA", 
 "yazA", "yabC"), IGD = c(16L, 18L, 22L, -3L, 24L, 15L, 18L, 19L, 
 -3L, 13L, 12L, 3L, 15L, -13L, -25L)), class = "data.frame",
  row.names = c("1", 
  "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
 "14", "15"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...