Мутировать новый столбец, сравнивая несколько значений столбца в другом фрейме данных в r

У меня есть фрейм данных DF, в который я хочу вставить новый столбец под названием Stage, сравнив его со столбцами Col1, Col2, Col3, Col4, Col5, Col6 фрейма данных DF1. Ниже мой пример формата данных

Col1=c("ABCD","","","","wxyz","")
Col2=c("","","MTNL","","","")
Col3=c("","PQRS","","","","")
Col4=c("","","","","","")
Col5=c("","","","","","")
Col6=c("","","","","","EFGH")

DF=data.frame(Col1,Col2,Col3,Col4,Col5,Col6)

Style=c("ABCD","WXYZ","PQRS","EFGH")
DF1=data.frame(Style)

Stage=c(1,1,3,6)
DFR=data.frame(Style,Stage)

DFR будет моим результирующим фреймом данных. Может ли кто-нибудь помочь мне решить эту проблему.


person ParthaSarathi    schedule 02.11.2020    source источник


Ответы (3)


Метод tidyverse:

library(tidyverse)

DFR <- DF %>% 
  mutate(across(everything(), ~na_if(., ""))) %>% 
  pivot_longer(cols = everything(),
               names_to = "Stage",
               values_to = "Style",
               values_drop_na = T) %>% 
  filter(Style %in% c("ABCD","WXYZ","PQRS","EFGH"))%>%
  mutate(Stage = as.integer(gsub("Col", "", Stage)))

Первый вызов mutate заменяет пустые значения на NA. Затем я перевожу вашу таблицу в длинный формат и отбрасываю значения NA, прежде чем фильтровать только Style значения, которые вас интересуют (их можно сохранить в векторе, чтобы сделать код более чистым, но здесь столбец и ваш вектор названы то же самое, поэтому я не хотел сбивать с толку). Второй вызов mutate является необязательным, он удаляет Col из каждого из ваших Stage значений и преобразует столбец в целочисленный тип.

person stlba    schedule 02.11.2020
comment
Это даст мне положение столбцов существования переменной стиля в DF. Но я хотел бы вставить положение переменных DF1 в DF .. Я хочу проверить наличие переменных стиля DF1 в DF, и если они существуют, то необходимо вставить положение столбца. @stlba - person ParthaSarathi; 02.11.2020
comment
О, я не заметил, что не все значения были включены в Style. Добавьте строку в конце, чтобы отфильтровать только те значения, которые есть в DF1. DF %>% filter(Style %in% c("ABCD","WXYZ","PQRS","EFGH")) - person stlba; 02.11.2020

Вы можете объединить данные после их преобразования в длинный формат.

library(dplyr)
library(tidyr)

DF %>%
  pivot_longer(cols = everything()) %>%
  right_join(DF1, by = c('value' = 'Style'))

#  name  value
#  <chr> <chr>
#1 Col1  ABCD 
#2 Col3  PQRS 
#3 Col6  EFGH 
#4 NA    WXYZ 
person Ronak Shah    schedule 02.11.2020

Я попытался решить эту проблему следующим образом, и он работает

DF <- DF %>% 
  mutate(across(everything(), ~na_if(., "")))

DFR=DF1
DFR$Stage=ifelse(is.na(DF1$Style),NA,ifelse(DF1$Style %in% DF$Col1,1,
                                            ifelse(DF1$Style %in% DF$Col2,2,
                                                   ifelse(DF1$Style %in% DF$Col3,3,
                                                          ifelse(DF1$Style %in% DF$Col4,4,
                                                                 ifelse(DF1$Style %in% DF$Col5,5,
                                                                        ifelse(DF1$Style %in% DF$Col6,6,NA)))))))
person ParthaSarathi    schedule 02.11.2020