簡體   English   中英

如何基於另一列的分組排列在數據框中創建新列

[英]How to create a new column in a dataframe based on grouped permutations of another column

我有一個像這樣的數據框:

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之前還是B之前的標簽來標記整個分組(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%>%group_by(grouping)%>%mutate(標簽= .......

但是在此之后,我迷失了如何指定標簽以P,B和G的順序為條件,以及如何解釋它們在每個組中重復多次的事實。

我去了這個交易所:

[ 如何根據其他列的排列在數據框中創建新列?

但由於我需要按分組列對它們進行分組,並且需要考慮每個變量中排列的不同數量(每個分組中可以包含3-15個P,B和G,因此),因此尚不清楚如何采用答案。

任何幫助是極大的贊賞。

library(tidyverse)

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

使用dplyrifelse一種解決方案可以實現為:

library(dplyr)

df %>% group_by(grouping) %>%
  mutate(label = ifelse(var[var!="P"][1] == "B","BFirst","GFirst" )) %>%
  as.data.frame()

#    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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM