Dplyr:通过使用 R

问题描述 投票:0回答:1

概述

我有一个 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))


r dataframe dplyr tidyverse data-manipulation
1个回答
1
投票
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")

请注意,我使用的是本机管道运算符 
|>

,但

%>%
也同样有效。
    

© www.soinside.com 2019 - 2024. All rights reserved.