Пустые столбцы, если строка содержит строку - PullRequest
0 голосов
/ 17 декабря 2018

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

x <- data.frame(id=c(1,2,3), 
               col1=c("UX1", "UX3", "UX2"),
               col2=c("UX2", "UX1", "UX1"),
               col3=c("PROC1", "PROC2", "PROC3"),
               col4=c("PROC3", "PROC3", "PROC1")
               )

output:

  id col1 col2  col3  col4
1  1  UX1  UX2 PROC1 PROC3
2  2  UX3  UX1 PROC2 PROC3
3  3  UX2  UX1 PROC3 PROC1

, и я хотел бы, чтобы выходные данные выглядели так:

x2 <- data.frame(id=c(1,2,3),  
           col1=c("UX1", "UX3", "UX2"),
           col2=c("UX2", "UX1", "UX1"),
           col3=c("PROC1", "PROC2", "PROC3"),
           col43=c("PROC3", "PROC3", "PROC1"),

           UX1=c(1,1,1),
           UX2=c(1,0,1),
           UX3=c(0,1, 0),
           PROC1 =c(1,0,1),
           PROC2=c(0,1,0),
           PROC3 = c(1,1,1))

Требуется вывод:

  id col1 col2  col3 col43 UX1 UX2 UX3 PROC1 PROC2 PROC3
1  1  UX1  UX2 PROC1 PROC3   1   1   0     1     0     1
2  2  UX3  UX1 PROC2 PROC3   1   0   1     0     1     1
3  3  UX2  UX1 PROC3 PROC1   1   1   0     1     0     1

Таким образом, для создания пустышки, если строка содержит строку.Я могу создать dummy.data.frame, используя library(dummies) например

y <- dummy.data.frame(x)

, но этот подход думает, что (например) UX1 в первом столбце отличается от UX1 во втором столбце.Так что dummy.data.frame не работает ...

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Просто для полноты, предлагая также альтернативу data.table:

# load the data table package
library(data.table)

# create the sample data set
x <- data.frame(id=c(1,2,3), 
                col1=c("UX1", "UX3", "UX2"),
                col2=c("UX2", "UX1", "UX1"),
                col3=c("PROC1", "PROC2", "PROC3"),
                col4=c("PROC3", "PROC3", "PROC1")
)

# convert data frame to data table
x <- data.table(x)

# first convert data to long format using melt function
# then use cast to go back to wide format, convert "value" variable to columns and check where are missing values
# then join on the original data set
x[dcast(melt(x, "id"), id ~ value, fun = function(x) sum(!is.na(x))), on = "id"]
0 голосов
/ 17 декабря 2018

Вот идея через tidyverse.Сначала мы gather все, кроме переменной id.Затем мы spread получаем требуемую структуру и используем просто replace для «дублирования» наших данных, то есть

library(tidyverse)

x %>% 
 gather(var, val, -id) %>% 
 spread(val, var, fill = 0) %>% 
 mutate_at(vars(-id), funs(replace(., . != 0, 1)))

, что дает

  id PROC1 PROC2 PROC3 UX1 UX2 UX3
1  1     1     0     1   1   1   0
2  2     0     1     1   1   0   1
3  3     1     0     1   1   1   0

После этого вы можете очень легко cbind() перейти к исходному фрейму данных, т.е.

x2 <- x %>% 
  gather(var, val, -id) %>% 
  spread(val, var, fill = 0) %>% 
  mutate_at(vars(-id), funs(replace(., . != 0, 1)))

cbind(x, x2)
#   id proc1 proc2 proc3 proc4 id PROC1 PROC2 PROC3 UX1 UX2 UX3
#1  1   UX1   UX2 PROC1 PROC3  1     1     0     1   1   1   0
#2  2   UX3   UX1 PROC2 PROC3  2     0     1     1   1   0   1
#3  3   UX2   UX1 PROC3 PROC1  3     1     0     1   1   1   0

ПРИМЕЧАНИЕ: Как указывает @mmn, мы можем merge вместо cbindто есть

x %>%
  gather(var, val, - id) %>%
  spread(val, var, fill = 0) %>%
  mutate_at(vars(-id), funs(replace(., . != 0, 1))) %>%
  left_join(x, ., by = 'id')

#  id col1 col2  col3  col4 PROC1 PROC2 PROC3 UX1 UX2 UX3
#1  1  UX1  UX2 PROC1 PROC3     1     0     1   1   1   0
#2  2  UX3  UX1 PROC2 PROC3     0     1     1   1   0   1
#3  3  UX2  UX1 PROC3 PROC1     1     0     1   1   1   0
...