R: Генерируйте фиктивную переменную, основываясь на существовании значения одного столбца в другом столбце. - PullRequest
2 голосов
/ 09 февраля 2020

У меня есть такой кадр данных:

A                    B          
2012,2013,2014     2011
2012,2013,2014     2012
2012,2013,2014     2013
2012,2013,2014     2014
2012,2013,2014     2015

Я хотел создать фиктивную переменную, которая указывает, существует ли значение в столбце B в столбце A. 1 указывает на существование, а 0 указывает на не -existant. Так что

A                    B       dummy        
2012,2013,2014     2011        0
2012,2013,2014     2012        1
2012,2013,2014     2013        1
2012,2013,2014     2014        1
2012,2013,2014     2015        0

Я пытался использовать %in% для достижения этой цели:

df$dummy <- ifelse(df$B %in% df$A, 1, 0)

, но оказалось, что все в столбце dummy равно 1 .

Та же самая ситуация произошла, когда я попытался использовать другой метод any():

df$dummy <- any(df$A==df$B)

все в столбце dummy равно TRUE.

Есть Есть ли эффективный способ создания этой фиктивной переменной?

Большое спасибо!

Ответы [ 4 ]

2 голосов
/ 09 февраля 2020

Похоже, что столбец A - это строка чисел, разделенных запятыми, поэтому %in% не подходит (было бы полезно, например, если вы проверили B внутри вектора из нескольких строк, или цифры, если A и B были цифрами c). Если ваша структура фрейма данных отличается, пожалуйста, дайте мне знать (и не стесняйтесь редактировать ваш вопрос).

Возможно, вы могли бы выполнить sh несколькими способами. Возможно, самый простой способ - использовать grepl по одной строке за раз, чтобы определить, присутствует ли столбец B в A.

library(tidyverse)

df %>%
  rowwise() %>%
  mutate(dummy = +grepl(B, A))

Выход

# A tibble: 5 x 3
  A              B     dummy
  <fct>          <fct> <int>
1 2012,2013,2014 2011      0
2 2012,2013,2014 2012      1
3 2012,2013,2014 2013      1
4 2012,2013,2014 2014      1
5 2012,2013,2014 2015      0

Данные

df <- data.frame(
  A = c(rep("2012,2013,2014", 5)),
  B = c("2011", "2012", "2013", "2014", "2015")
)
1 голос
/ 09 февраля 2020

Вот еще одно решение, использующее tidyverse. Основная проблема в том, что A читается как строка. Мое решение сначала разделяет каждое число на разные столбцы, а затем сравнивает B с этими числами.

library(tidyverse)

df %>%
  #Separate A into separate numbers
  separate(col = A,
           sep = ",",
           into = c("S1","S2","S3")) %>%
  #Compare B to the new columns and fill dummy
  mutate(dummy = ifelse(B %in% c(S1,S2,S3), 1, 0))
1 голос
/ 09 февраля 2020

Создание файла с разделителями табуляции:

A   B          
2012,2013,2014  2011
2012,2013,2014  2012
2012,2013,2014  2013
2012,2013,2014  2014
2012,2013,2014  2015

Вот способ использования str_detect из stringr :

read.table('test.txt', header = TRUE) %>% 
  mutate(
    B = as.character(B),
    dummy = case_when(
      str_detect(pattern = B, fixed(A)) ~ '1',
      TRUE ~ '0'
    )
  )
1 голос
/ 09 февраля 2020

Если вы хотите использовать базу R:

df <- data.frame(A = rep("2012,2013,2014", 5), B = c("2011", "2012","2013","2014","2015"))

for(i in 1:nrow(df)){
     df$dummy[i] <- grepl(df$B[i],df$A[i])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...