Создание новых столбцов на основе существующих столбцов в R - PullRequest
1 голос
/ 30 января 2020

Это образец моего фрейма данных. Из опроса, где исходный вопрос звучал так: «Где вы находитесь? Отметьте все подходящие варианты».

Code   Option1   Option2   Option3   Option4
101        A        C         NA        NA
102        B        D         NA        NA
103        A        B         D         NA
104        D        NA        NA        NA
105        A        B         C         D

Я хотел бы преобразовать эти данные, чтобы каждый столбец был одним из местоположений, и вы получите 0/1, если вы находитесь в любом из 4 мест:

Code   A   B   C   D
101    1   0   1   0
102    0   1   0   1
103    1   1   0   1
104    0   0   0   1
105    1   1   1   1

Я пытался использовать операторы ifelse, но получал ошибки. Какие-либо предложения? Спасибо!

Ответы [ 4 ]

1 голос
/ 30 января 2020

Используя tidyverse

library(dplyr)
library(tidyr)
df1 %>%
    pivot_longer(cols = -Code, values_drop_na = TRUE) %>% 
    mutate(n = 1) %>% 
    select(-name) %>% 
    pivot_wider(names_from = value, values_from = n, values_fill = list(n = 0)) %>%
    select(Code, LETTERS[1:4])
#   Code A B C D
#1  101 1 0 1 0
#2  102 0 1 0 1
#3  103 1 1 0 1
#4  104 0 0 0 1
#5  105 1 1 1 1

Или используя mtabulate

library(qdapTools)
cbind(df1[1], +(mtabulate(as.data.frame(t(df1[-1]))) > 0))

Или используя melt/dcast

library(data.table)
dcast(melt(setDT(df1), id.var = 'Code', na.rm = TRUE), Code ~ value, length)
0 голосов
/ 30 января 2020

Предполагая, что 'df1' - ваша таблица, этот подход занимает несколько строк, но его легко понять:

library(tidyverse)
library(reshape2)

df1 %>% 
  gather(Code) %>% 
  dcast(Code ~ value, fun.aggregate=length) %>%
  select(-'NA')

Ваш результат:

  Code A B C D
1  101 1 0 1 0
2  102 0 1 0 1
3  103 1 1 0 1
4  104 0 0 0 1
5  105 1 1 1 1
0 голосов
/ 30 января 2020

Вы можете попробовать:

tab <- table(cbind(df[1], unlist(df[-1])))
cbind(Code = row.names(tab), as.data.frame.matrix(tab), row.names = NULL)

  Code A B C D
1  101 1 0 1 0
2  102 0 1 0 1
3  103 1 1 0 1
4  104 0 0 0 1
5  105 1 1 1 1
0 голосов
/ 30 января 2020

Я делал это при преобразовании ответов на опрос True / False в двоичное число 1,0 с помощью gsub:

t <- function(x) gsub("A",1,x)
f <- function(x) gsub("B",0,x)

df[1:4] <- lapply(df[1:4], t)
df[1:4] <- lapply(df[1:4], f)

Я уверен, что есть лучший способ сделать это, но это сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...