我在csv中接收到数据。从Salesforce提取的报告中。每行代表一个交易以及从事该交易的人员。在很多情况下,有1个以上的人从事同一笔交易,因此在这些情况下,存在重复的行,显示日期,时间戳,位置,办公室等。该人的姓名除了。
我希望每一行代表一个交易,如果有多个人从事同一笔交易,则会创建一个新列来捕获另一人的姓名。
这是数据的样子:
Trans_ID | Name
================
1 | Dom Toretto
2 | Brian Oconnor
3 | Letty Garcia
3 | Mia Toretto
4 | Brian Oconnor
4 | Dom Toretto
4 | Letty Garcia
4 | Jesse
这就是我想要的:
Trans_ID | Name | Name2 | Name3 | Name4
===============================================================
1 | Dom Toretto | Letty Garcia | |
2 | Brian Oconnor | | |
3 | Letty Garcia | Mia Toretto | |
4 | Brian Oconnor | Dom Toretto | Letty Garcia | Jesse
我想在R中执行此操作,但是如果在SQL或Excel中更方便,那也可以。
谢谢!
编辑 因此,我尝试使用case when和lag来执行此操作,但是现在我遇到了一个新问题,即删除不再需要的行。这也可能是错误的方法。有什么想法吗?
df<- data.frame(trans_id = c(1,2,3,3,4,4,4,4),
Name = c("Dom Toretto","Brian Oconnor","Letty Garcia","Mia Toretto","Brian Oconnor","Dom Toretto","Letty Garcia","Jesse"))
df %>%
mutate(
Name2 = case_when(
trans_id == lag(trans_id) ~ lag(Name)
),
Name3 = case_when(
trans_id == lag(trans_id, 2) ~ lag(Name, 2)
),
Name4 = case_when(
trans_id == lag(trans_id, 3) ~ lag(Name, 3)
))
答案 0 :(得分:1)
这将与nest
和map
函数df一起使用:
df <- tibble(Trans_ID = c(1,2,3,3,4,4,4,4),
Name = c("Dom Toretto", "Brian Oconnor", "Letty Garcia",
"Mia Toretto", "Brian Oconnor", "Dom Toretto",
"Letty Garcia", "Jesse"))
然后在Trans ID上嵌套并映射每个数据框:
df %>%
nest(-Trans_ID) %>%
mutate(
data = map(data, ~ mutate(.x,
col_name = str_c("Name", row_number())) %>%
spread("col_name", "Name"))
) %>%
unnest()
返回:
Trans_ID Name1 Name2 Name3 Name4
<dbl> <chr> <chr> <chr> <chr>
1 1 Dom Toretto NA NA NA
2 2 Brian Oconnor NA NA NA
3 3 Letty Garcia Mia Toretto NA NA
4 4 Brian Oconnor Dom Toretto Letty Garcia Jesse
希望这会有所帮助!
答案 1 :(得分:0)
在这里您遇到一种情况,其中每一行都有不同数量的条目。这告诉我,您很可能不想将这些数据存储在数据框或类似矩阵的对象中。这些对象主要用于正方形数据,而您不是。我不知道您的用例,但我可能会将这些数据存储在字符向量列表中。您可以使用split()
output <- split(df$Name,df$Trans_ID)
如果您有理由将其存储在缺少值的正方形数据对象中,则有很多方法可以转换上述内容。例如,使用数据表。
library(data.table)
squareoutput <- rbindlist(lapply(output,function(x)data.table(x)),fill=TRUE)