我有一个这样的数据框“员工”:
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
答案 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)