Как добавить развернуть таблицу данных на основе информации таблицы - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующая таблица данных:

RowID| Col1   | Col2 |
----------------------
1    | apple  | cow  |
2    | orange | dog  |
3    | apple  | cat  |
4    | cherry | fish |
5    | cherry | ant  |
6    | apple  | rat  |

Я хочу попасть в эту таблицу:

RowID| Col1   | Col2 | newCol
------------------------------
1    | apple  | cow  | cat
2    | apple  | cow  | rat   
3    | orange | dog  | na        
4    | apple  | cat  | cow
5    | apple  | cat  | rat   
6    | cherry | fish | ant       
7    | cherry | ant  | fish      
8    | apple  | rat  | cow
9    | apple  | rat  | cat   

Чтобы помочь визуализировать логику вышеприведенной таблицы, она будет по существу такой же, как и в приведенной ниже таблице, но столбец списка будет разбит на строки в зависимости от имеющихся значений. Он соответствует значениям в столбце col1, поэтому, например, строки 1, 3 и 6 исходной таблицы содержат «яблоко» в первом столбце. Поэтому новый столбец списка будет включать все значения Col2 соответствующих строк. Затем разверните в новую строку для каждого элемента списка. Вторая таблица выше - это результат, который я хочу получить. Эта третья таблица предназначена для того, чтобы помочь визуализировать, откуда поступают значения.

RowID| Col1   | Col2 | newCol
------------------------------
1    | apple  | cow  | cat,rat   (Row 3 & 6 match col1 values)
2    | orange | dog  | na        (No rows match this col1 value)
3    | apple  | cat  | cow,rat   (Row 1 & 6 match col1 values)
4    | cherry | fish | ant       (Row 5 matches col1 values)
5    | cherry | ant  | fish      (Row 4 matches col1 values)
6    | apple  | rat  | cow,cat   (Row 1 & 3 match col1 values)

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Сам присоединиться к таблице в первом столбце, избавиться от строк, где NewCol равен Col2. Сложным является сохранение строк в таблице данных, которые встречаются только один раз.

require(data.table)
require(magrittr)

dt_foo = data.table(Col1 = c("apple", "orange","apple","cherry",
                      "cherry", "apple"),
                    Col2 = c("cow","dog","cat","fish",
                      "ant","rat"))

# required to later set NA values
single_occ = dt_foo[, .N, Col1] %>% 
  .[N == 1, Col1]

dt_foo2 = dt_foo %>% 
  .[., on = "Col1", allow.cartesian = T] %>% 
  setnames("i.Col2", "NewCol") %>% 
  .[Col1 %in% single_occ, NewCol := NA] %>% 
  .[Col2 != NewCol | is.na(NewCol)]
0 голосов
/ 03 июля 2018

Использование пакета :

library(data.table)

# option 1
setDT(dat)[, .SD[CJ(Col2 = Col2, newCol = Col2, unique = TRUE), on = .(Col2)]
           , by = Col1
           ][order(RowID), .SD[Col2 != newCol | .N == 1], by = RowID]

# option 2
setDT(dat)[, newCol := paste0(Col2, collapse = ","), by = Col1
           ][, .(newCol = unlist(tstrsplit(newCol, ","))), by = .(RowID, Col1, Col2)
             ][, .SD[Col2 != newCol | .N == 1], by = RowID]

, что дает:

   RowID   Col1 Col2 newCol
1:     1  apple  cow    cat
2:     1  apple  cow    rat
3:     2 orange  dog    dog
4:     3  apple  cat    cow
5:     3  apple  cat    rat
6:     4 cherry fish    ant
7:     5 cherry  ant   fish
8:     6  apple  rat    cow
9:     6  apple  rat    cat

A Эквивалент:

library(dplyr)
library(tidyr)

dat %>% 
  group_by(Col1) %>% 
  mutate(newCol = paste0(Col2, collapse = ",")) %>% 
  separate_rows(newCol) %>% 
  group_by(RowID) %>% 
  filter(Col2 != newCol | n() == 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...