我有这个数据框:
ers1 task
t1 3 t1
t2 3 t2
t3 3 t3
t4 4 t4
t5 3 t5
t6 4 t6
t7 4 t7
t8 3 t8
数据描述了一组员工的任务分配(8个不同的任务)。我想汇总给定员工的任务,以获取如下信息:
ers task1 task2 task3 task4 task5
3 t1 t2 t3 t5 t8
4 t4 t6 t7
有什么建议吗? 谢谢
答案 0 :(得分:0)
有关一种创造性的方法,请参见base R中的以下解决方案。
d1 <- data.frame(ers1 = c(3,3,3,4,3,4,4,3), task = paste0("t",1:8)) # raw data
d2 <- table(d1) # use table to do the reshaping work here
l1 <- apply(d2, 1, function(x) colnames(d2)[index(x)*x]) # use the 0s and 1s to fill tasks
d3 <- t(sapply(l1, '[', seq(max(sapply(l1, length))))) # combine lists of varying lengths
colnames(d3) <- paste0("t",1:ncol(d3)) # create colnames
d3[is.na(d3)] <- "" # change NAs to blanks as desired
d3
# t1 t2 t3 t4 t5
#3 "t1" "t2" "t3" "t5" "t8"
#4 "t4" "t6" "t7" "" ""
就个人而言,我会在得到l1
(清单1)之后停下来,因为它似乎对编程/应用函数更有用。
答案 1 :(得分:0)
感谢让我知道tidyverse库中的传播命令。
我一口气解决了这个问题
Column 2 must be named
答案 2 :(得分:-1)
还可以使用split
中的data.table
library(data.table)
split(setDT(d1),by=c("ers1"),keep.by = FALSE)
$`3`
task
1: t1
2: t2
3: t3
4: t5
5: t8
$`4`
task
1: t4
2: t6
3: t7
然后,获取所需的格式:
sapply( split(setDT(d1),by="ers1",keep.by = FALSE),'[',1:5)
$`3.task`
[1] t1 t2 t3 t5 t8
Levels: t1 t2 t3 t4 t5 t6 t7 t8
$`4.task`
[1] t4 t6 t7 <NA> <NA>
Levels: t1 t2 t3 t4 t5 t6 t7 t8