概述
我有一个 444 行和 361 列的数据框。在名为“协作”、“小型协作”和“分包商”的 3 列中,我输入了显示协作者姓名的多个因素,所有因素都输入到一个单元格中,并用逗号分隔。有些单元格最多可以包含 30 个名称。
目标:我的最终目标是通过操纵每个单元格中的因素(用逗号分隔)来重新排列数据框
(参见表 1 - 列标题“协作”、“小型协作”和“分包商”),然后放置将所有三列中的所有信息放入单独的单独行 (参见表 2) 中,称为 “协作”。
问题:在某些单个单元格中,没有名称,只有值零,并且,我不想在新列
“协作”中输出带有零的多行。 将来,我希望能够过滤每个协作者姓名输出的新数据框,以跟踪他们的工作日期和工作历史。
很抱歉没有提供示例代码,但我不是 R 专家。我可以使用
dplyr和 data.table,但是 我很努力地寻找方法,但没有成功。 这个问题
将一列中的逗号分隔字符串拆分为单独的行被标记给我,它对于使用此代码重新排列一列非常有帮助:
Df %>% mutate(Collaborations = strsplit(as.character(Collaborations), ",")) %>% unnest(Collaborations)
但是,我不确定如何以这种方式重新排列三列,将它们放入一列中,然后删除包含零的列,以便它们不会重复到新列中'Collaborators'
。 我在下面提供了一个示例数据框。如果有人可以提供帮助,我将不胜感激。
表1表2
数据框
structure(list(Date = structure(c(1L, 3L, 4L, 5L, 6L, 2L), levels = c("1/1/23",
"10/1/23", "2/1/23", "4/1/23", "6/1/23", "8/1/23"), class = "factor"),
Start_Time = structure(c(6L, 4L, 3L, 5L, 1L, 2L), levels = c("4:30",
"5:13", "7:30", "8:25", "8:45", "9:10"), class = "factor"),
End_Time = structure(c(2L, 1L, 4L, 5L, 6L, 3L), levels = c("12:30",
"14:15", "14:20", "15:25", "16:17", "18:17"), class = "factor"),
Project = structure(c(6L, 1L, 2L, 5L, 3L, 4L), levels = c("Business_Ltd",
"Clyde_Ltd", "Fabian_Ltd", "Friends_Ltd", "Greenhouse_Ltd",
"Red_Ltd"), class = "factor"), Collaborations = structure(c(2L,
6L, 1L, 4L, 5L, 3L), levels = c("FRANK, TESSA", "JON, SAM, LEAH",
"LEO, TIA", "LOUISE, TINA", "PATTY, JOAN", "PIERRE, LESLEY"
), class = "factor"), Mini_Collborations = structure(c(3L,
5L, 1L, 1L, 4L, 2L), levels = c("0", "GEORGE", "MEL", "TILLY",
"TONY, JIM"), class = "factor"), Subcontractors = structure(c(5L,
2L, 1L, 1L, 4L, 3L), levels = c("0", "CHAN, BEN", "KIM, UNA",
"KIRK, TRACY, KELLY", "SKYLER, TEESCHA"), class = "factor")), class = "data.frame", row.names = c(NA,
-6L))
dplyr
将数据转换为长格式并删除“0”条目的解决方案:
df |>
pivot_longer(cols = c(Collaborations, Mini_Collborations, Subcontractors),
names_to = "Role",
values_to = "Collaborations") |>
separate_rows(Collaborations, sep = ", ") |>
select(-Role) |>
filter(Collaborations != "0")
请注意,我使用的是本机管道运算符
|>
,但
%>%
也同样有效。