使用dplyr根据阈值创建新的数据帧

使用dplyr根据阈值创建新的数据帧,r,dataframe,dplyr,R,Dataframe,Dplyr,以下是dput: Groups Names COL1 COL2 COL3 COL4 1 G1 SP1 1 0.400 0.500 Sequence1 2 G1 SP1 1 0.004 0.005 Sequence2 3 G1 SP1 0 0.004 0.005 Sequence3 4 G1 SP2 0 0.400 0.005 Sequence123 5 G1 SP2

以下是
dput

   Groups Names COL1  COL2  COL3        COL4
1      G1   SP1    1 0.400 0.500   Sequence1
2      G1   SP1    1 0.004 0.005   Sequence2
3      G1   SP1    0 0.004 0.005   Sequence3
4      G1   SP2    0 0.400 0.005 Sequence123
5      G1   SP2    0 0.004 0.500  Sequence14
6      G1   SP3    0 0.005 0.006  Sequence15
7      G1   SP5    1 0.400 0.006  Sequence16
8      G1   SP6    1 0.008 0.002  Sequence20
10     G2   Sp1    0 0.004 0.005  Sequence17
11     G2   SP1    0 0.050 0.600  Sequence18
12     G2   SP1    0 0.400 0.600   Sequence3
13     G2   SP2    0 0.004 0.005  Sequence22
14     G2   SP2    0 0.004 0.005  Sequence23
15     G2   SP5    0 0.004 0.005  Sequence16
16     G2   SP6    0 0.003 0.002  Sequence21
17     G2   SP7    0 0.560 0.760  Sequence67
rame I what获取另一个数据帧,例如:

dput(test_df)
structure(list(Groups = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("G1", "G2"), class = "factor"), 
    Names = structure(c(2L, 2L, 2L, 3L, 3L, 4L, 5L, 6L, 1L, 2L, 
    2L, 3L, 3L, 5L, 6L, 7L), .Label = c("Sp1", "SP1", "SP2", 
    "SP3", "SP5", "SP6", "SP7"), class = "factor"), COL1 = c(1L, 
    1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
    ), COL2 = c(0.4, 0.004, 0.004, 0.4, 0.004, 0.005, 0.4, 0.008, 
    0.004, 0.05, 0.4, 0.004, 0.004, 0.004, 0.003, 0.56), COL3 = c(0.5, 
    0.005, 0.005, 0.005, 0.5, 0.006, 0.006, 0.002, 0.005, 0.6, 
    0.6, 0.005, 0.005, 0.005, 0.002, 0.76), COL4 = structure(c(1L, 
    8L, 13L, 2L, 3L, 4L, 5L, 9L, 6L, 7L, 13L, 11L, 12L, 5L, 10L, 
    14L), .Label = c("Sequence1", "Sequence123", "Sequence14", 
    "Sequence15", "Sequence16", "Sequence17", "Sequence18", "Sequence2", 
    "Sequence20", "Sequence21", "Sequence22", "Sequence23", "Sequence3", 
    "Sequence67"), class = "factor")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "10", "11", "12", "13", "14", 
"15", "16", "17"))
and from this dataf
我们的想法是,每个组添加行中的名称,并在单元格中添加字母A、B、X或NA,如果我们在另一组中找到至少一个物种的相同COL4值,则大小写将取决于大小写

  • 名称
    任何
    行具有
    COL1>0
    且至少有一个名称在不同组中具有与相同名称相同的
    COL4
    内容时,将放置A
  • Name
    any
    行具有
    COL1>0
    且在不同组中没有与相同名称具有相同
    COL4
    内容的名称时,将放置a
  • 名称的
    任何
    行具有
    COL1=0
    COL2
    COL3>0.05
    且在不同组中至少有一个名称具有与相同名称相同的
    COL4
    内容时,将放置B
  • 名称的
    任何
    行具有
    COL1=0
    COL2
    COL3>0.05
    且在不同组中没有与相同名称具有相同
    COL4
    内容的名称时,将放置b
  • Name
    all
    行具有
    COL1=0
    COL2``或
    COL3>0.05
    至少有一个名称在不同组中具有与相同名称相同的
    COL4
    内容时,将放入X
  • Name
    all
    行具有
    COL1=0
    COL2
    COL3>0.05
    在不同组中没有与同一名称具有相同内容的
    COL4
    名称时,将放置x
  • 如果
    组中没有
    名称
    ,则输入NA
让我们举4个例子:

(一) 我们看到,对于
G1-SP1
row1
有一个
COL1>0
,那么它将在新的数据帧中有一个字母
a
a
。 现在为了知道它是
A
还是
A
我们必须查看
COL4
,我们在
row12
中看到
Sequence3
对于
SP1
也存在于
G2
中,因此它将是一个“A”

(二) 我们看到,对于
G2-SP1
row12
有一个
COL2
COL3
>0.05
,那么它在新的数据帧中将有一个字母
B
B
。 它将是
B
,因为在
G1
中,
row3
序列3也存在于SP1的G2中

(三) 我们看到,对于
G2-SP2
,没有一行具有
COL1>0X
COL2
COL3
>0.05
,那么它将在新数据帧中具有字母
B
x
。 它将是
x
,因为在其他
组中没有其他
SP2
具有相同的序列`(Sequence22、Sequence23或Sequence24)

(四) 我们看到,对于
G1-SP6
而言,
row8
有一个
COL1>0
,那么它将在新的数据帧中有一个字母
a
a
。 它将是
a
,因为其他
组中没有其他
SP1
具有相同的序列
(Sequence20)

`

为此,我尝试:

    G1  G2
SP1 A   B
SP2 x   x
SP3 x   NA
SP4 NA  NA
SP5 A   X
SP6 a x
SP7 NA b
Env_表%
分组依据(组、名称)%>%
mutate(Env_variable=replace_na(COL1,“.”),
环境变量=ifelse(任意(COL1>=1),“A”,环境变量))%>%
变异(环境变量=ifelse(全部(COL1==0)和全部(COL2>0.05)和全部(COL3>0.05),“B”,环境变量))%>%
变异(Env_变量=ifelse(all(COL1==0)和&all(COL2%)
变异(Env_变量=ifelse(all(COL1==0)&&all(COL2>0.05)&&all(COL3%)
变异(Env_变量=ifelse(all(COL1==0)和all(!is.na(COL1))和all(COL2>0.05)和all(COL3>0.05),“*”,Env_变量))%>%
切片(1)%>%
pivot\u更宽(id\u col=Names,Names\u from=Groups,values\u from=Env\u variable)%>%
排列(作为.integer(str_extract(名称“\\d+”))
其中
Env_variable
只是一个空列,用于存储A、B、X或NA值


感谢您的帮助

您的问题并不十分清楚,但这里有一个答案:

Env_table<-as.data.frame(test_df) %>%
  group_by(Groups,Names) %>%
  mutate(Env_variable = replace_na(COL1, "."),
         Env_variable = ifelse(any(COL1 >=1) , "A", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0 ) && all(COL2 >0.05) && all(COL3 >0.05) , "B", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0 ) && all(COL2 <0.05) && all(COL3 <0.05) , "X", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0 ) && all(COL2 <0.05) && all(COL3 >0.05) , "X", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0 ) && all(COL2 >0.05) && all(COL3 <0.05) , "X", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0) && all(!is.na(COL1)) && all(COL2 >0.05) && all(COL3 >0.05) , "*", Env_variable))%>%
  slice(1) %>%
  pivot_wider(id_col = Names, names_from = Groups, values_from = Env_variable) %>%
  arrange(as.integer(str_extract(Names, "\\d+")))
test_df%>%
分组依据(组、名称)%>%
总结(
x=情况(
任意(COL1>=1,na.rm=TRUE)~“A”,
任何(COL1==0&(COL2>0.05&COL3>0.05),na.rm=TRUE)~“B”,

任意(COL1==0&(COL2@Grendel我认为我的答案涵盖了您的算法,但您的预期答案不同。为什么G2-SP1应该是B,因为第9行的COL1==1?此外,您的算法对于B和X之间的差异还不够清楚。请注意,“but”不是一个逻辑术语;-)很抱歉我更改了它。事实上它是X当COL1=0,COL2或COL3为0.05,COL3>0.05时,获得a的唯一方法是让COL1>1。不,你是对的,它应该是a。我也更改了它。谢谢你的时间!为了增加复杂性,我编辑了一点帖子(这个想法也是为了添加大写或小写的信息(这取决于我们是否在另一组中发现至少一个物种的相同COL4值).也许你有一个想法可以将其包含在你的代码中?这是一个不同的问题,与你的第一个问题几乎没有关系,应该在另一篇文章中。我应该考虑一下,但现在我不确定你如何才能做到这一点。
test_df %>% 
  group_by(Groups, Names) %>% 
  summarise(
    x=case_when(
      any(COL1>=1, na.rm=TRUE) ~ "A",
      any(COL1==0 & (COL2>0.05 & COL3>0.05), na.rm=TRUE) ~ "B",
      any(COL1==0 & (COL2<0.05 | COL3<0.05), na.rm=TRUE) ~ "X",
      TRUE ~ NA_character_
    )
  ) %>% 
  pivot_wider(names_from = Groups, values_from = x)
  Names G1    G2   
  <fct> <chr> <chr>
1 SP1   A     B    
2 SP2   X     X    
3 SP3   X     NA   
4 SP5   A     X    
5 SP6   A     X    
6 SP1   NA    X    
7 SP7   NA    B