如何根据另一列

时间:2018-04-13 20:57:04

标签: r dataframe

我有一个这样的数据框:

df <- data.frame(grouping = c(rep("site1_1",9), rep("site2_1",9)),
                 var = c(rep("P", 3), rep("G", 3), rep("B",3),rep("P", 3), rep("B", 3), rep("G",3)),
                 order= c(rep(0, 3), rep(1, 3), rep(2,3),rep(0, 3), rep(1, 3), rep(2,3)))

   grouping var order
1   site1_1   P     0
2   site1_1   P     0
3   site1_1   P     0
4   site1_1   G     1
5   site1_1   G     1
6   site1_1   G     1
7   site1_1   B     2
8   site1_1   B     2
9   site1_1   B     2
10  site2_1   P     0
11  site2_1   P     0
12  site2_1   P     0
13  site2_1   B     1
14  site2_1   B     1
15  site2_1   B     1
16  site2_1   G     2
17  site2_1   G     2
18  site2_1   G     2

我有一个列,表示一个名为分组的唯一ID(从不重复)。在每个分组中,我有3个变量(P,G和B)。如上所示,它们会在分组中重复多次。

顺序始终为P,G,B或P,B,G。在一组中,P总是0,B / G是1或2.它们在组内永远不能是1和2,在组之间它是B或G是1还是2的随机性。

我有一个订单栏,用于显示var在每个组中的顺序

我想添加一个新列,根据B是否在G之前标记整个分组(P,B和G),反之亦然。

这是一个例子:

   grouping var order  label
1   site1_1   P     0 Gfirst
2   site1_1   P     0 Gfirst
3   site1_1   P     0 Gfirst
4   site1_1   G     1 Gfirst
5   site1_1   G     1 Gfirst
6   site1_1   G     1 Gfirst
7   site1_1   B     2 Gfirst
8   site1_1   B     2 Gfirst
9   site1_1   B     2 Gfirst
10  site2_1   P     0 Bfirst
11  site2_1   P     0 Bfirst
12  site2_1   P     0 Bfirst
13  site2_1   B     1 Bfirst
14  site2_1   B     1 Bfirst
15  site2_1   B     1 Bfirst
16  site2_1   G     2 Bfirst
17  site2_1   G     2 Bfirst
18  site2_1   G     2 Bfirst

我不清楚如何做到这一点。

使用dplyr我从

开始

df%&gt;%group_by(分组)%&gt;%mutate(label = .......

但在此之后,我失去了如何指定标签是以P,B和G序列顺序为条件的,以及如何说明它们在每组中重复多次的事实

我去了这个交流:

[How can I create a new column in a dataframe based on permutations of other columns?

但我不清楚如何采用答案,因为我需要按分组列对它们进行分组,并且需要考虑每个变量中不同数量的排列(可能有3-15 P&#39; s,每个分组中都有B&G和

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

library(tidyverse)

df %>% 
  group_by(grouping) %>% 
  mutate(label = paste0(substr(gsub("[^G|B]", "", paste(unique(var), collapse = "")), 1, 1), "first"))

答案 1 :(得分:1)

使用library(shinydashboard) library(shiny) library(DT) myData <- matrix( data=c('13,867','$229,153','30,128','$16.53','98.17%','39.69%'), nrow = 6, ncol = 1, dimnames = list(letters[1:6], c("Metrics")) ) ui <- dashboardPage( dashboardHeader(), dashboardSidebar(), dashboardBody( box(DTOutput("table")) ) ) server <- function(input, output) { output$table <- renderDT({ myData }, options = list(rownames = TRUE)) } shinyApp(ui, server) dplyr的一个解决方案可以实现为:

ifelse