【问题标题】:recode in dplyr giving Error: Argument 2 must be named, not unnamed在 dplyr 中重新编码,给出错误:参数 2 必须命名,而不是未命名
【发布时间】:2019-01-01 12:12:43
【问题描述】:

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

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

现在我想以 Dept_Id 具有部门名称而不是 Dept_Id 的方式转换此数据框。

我正在尝试使用dplyr中的recode,因为我的转换逻辑来自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

【问题讨论】:

  • @Ronak 编辑了同样的问题。

标签: r dataframe dplyr


【解决方案1】:

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

方法一:

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

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

方法二:

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

方法三:

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

【讨论】:

  • 感谢@YOHO 将尝试这些并更新您。干杯,新年快乐!
  • 我尝试了您的回答,但是在根据您的设置获取名称时遇到问题,因为您在名称中使用的条件
  • 您可以使用上面 ronak 的答案中的 lookup 表,并使用以下方法将表转换为 name 向量:name &lt;- lookup$X2; names(name) &lt;- lookup$X1
  • 你可以使用codes = setNames(as.list(lookup$X2), lookup$X1)创建codes
  • 很好的答案,@YOLO。你能解释一下三重感叹号!!! 的作用??? :) 谷歌搜索没有找到任何明显的答案
【解决方案2】:

您的数据框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,就很容易通过IDmatch并得到相应的名字。

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

【讨论】:

  • 完美!谢谢@Ronak Shah
  • 如果 Dept_Id 以某种方式来自一个变量,例如:col
  • @Deep 这取决于input_data[1,2] 的样子。最终目标是创建一个类似于lookup 的数据框,其中一列具有Dept_Id,另一列具有Dept_Name
  • 没关系..这是一个空间问题,同时用
【解决方案3】:

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

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

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)

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多