перекодировать в dplyr, давая Ошибка: Аргумент 2 должен быть назван, а не безымянный - PullRequest
0 голосов
/ 01 января 2019

У меня есть фрейм данных "сотрудник", подобный этому:

Emp_Id,Name,Dept_Id
20203,Sam,1
20301,Rodd,2
30321,Mike,3
40403,Derik,4

Теперь я хочу преобразовать этот фрейм данных таким образом, чтобы у Dept_Id были имена отделов вместо Dept_Id.

Япытаясь использовать recode из dplyr для этого, так как моя логика преобразования исходит из CSV, я должен был бы использовать переменную вместо логики преобразования.

Я использовал read.csv, чтобы получить мой dataframedf где находится моя логика (1=HR,2=IT и т. Д.), А затем получить ее в виде списка:

df:

Source,Target,Transformation
Employee,Emp,"1=HR,2=Sales,3=Finance,4=IT"

Чтобы получить логин для преобразования с df

myList <- as.character(df[1,3])

Теперь заменим данные в сотруднике в соответствии с логикой

employee$Dept_Id <- recode(employee$Dept_Id,myList)

В этой строке это дает мне:

Error: Argument 2 must be named, not unnamed

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Ваш фрейм данных df имеет другую структуру, что затрудняет непосредственное применение функций.Мы должны очистить его и привести в более удобный формат, чтобы его можно было легко запрашивать.

Один из способов сделать это - разделить данные на , и =, чтобы создать новый фрейм данных (lookup) с идентификатором отдела и именем.

lookup <- data.frame(t(sapply(strsplit(as.character(df[1,3]), ",")[[1]],
                        function(x) strsplit(x, "=")[[1]])), row.names = NULL)

lookup
#  X1      X2
#1  1      HR
#2  2   Sales
#3  3 Finance
#4  4      IT

Как только у нас будет lookup, тогда легко match по ID и получить соответствующее имя.

employee$Dept_Name <- lookup$X2[match(employee$Dept_Id, lookup$X1)]

employee
#  Emp_Id  Name Dept_Id Dept_Name
#1  20203   Sam       1        HR
#2  20301  Rodd       2     Sales
#3  30321  Mike       3   Finance
#4  40403 Derik       4        IT
0 голосов
/ 01 января 2019

Другой способ Если вы не хотите менять свою существующую базу данных, а список отделов не слишком велик.

Предположение: в вашем "сотруднике" нет пропущенных данныхбаза данных.если какие-либо недостающие данные доступны, необходимо добавить еще один уровень условия.

ifelse - это простой способ применить вашу логику, я упоминал об этом в коде ниже

New_DF = ifelse(employee$Dept_Id == 1,"HR",ifelse(employee$Dept_Id == 2,"Sales",ifelse(employee$Dept_Id == 3,"Finance","IT")))
New_DF = cbind(employee,New_DF)
0 голосов
/ 01 января 2019

Есть несколько способов сделать это.Один из способов:

Метод 1:

df$Dept_Id <-  name[match(df$Dept_Id, names(name))]

    Emp_Id Name Dept_Id
1:  20203  Sam      HR
2:  20301 Rodd      IT

Метод 2:

df <- df %>% 
    mutate(Dept_Id_2 = case_when(
        Dept_Id == 1 ~ 'HR',
        Dept_Id == 2 ~ 'IT'
    ))

Метод3:

codes <- list("1" = "HR", "2" = "IT")

df %>% 
    mutate(d2 = recode(Dept_Id, !!!codes))

Настройка

df <- fread("
Emp_Id  Name Dept_Id
20203   Sam  1
20301   Rodd 2            
")

name <- c("1" = "HR", "2"="IT")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...