根据R中前n行的条件创建一个新列

时间:2019-07-09 16:41:43

标签: r

我在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)
))

2 个答案:

答案 0 :(得分:1)

这将与nestmap函数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)