在dplyr中重新编码,给出错误:必须命名参数2,而不是未命名

时间:2019-01-01 12:12:43

标签: r dataframe dplyr

我有一个这样的数据框“员工”:

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来获取数据框df和逻辑(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 :(得分:2)

有多种方法可以做到这一点。一种方法是:

方法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")

答案 1 :(得分:1)

您的数据帧df具有不同的结构,这使得直接应用功能变得困难。我们需要清理它,并以更好的格式对其进行处理,以便轻松查询它。

一种方法是拆分,=上的数据,以创建具有部门ID和名称的新数据框(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,就很容易通过ID match并获得相应的名称。

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

答案 2 :(得分:0)

另一种方式,如果您不想更改现有数据库并且部门列表不太大。

假设:“员工”数据库中没有任何缺失的数据。如果缺少任何可用数据,则需要再增加一层条件。

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)