使用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
内容时,将放置ACOL4
- 当
的Name
行具有any
且在不同组中没有与相同名称具有相同COL1>0
内容的名称时,将放置aCOL4
- 当
名称的
任何
行具有
和COL1=0
和COL2
且在不同组中至少有一个名称具有与相同名称相同的COL3>0.05
内容时,将放置BCOL4
- 当
名称的
任何
行具有
和COL1=0
和COL2
且在不同组中没有与相同名称具有相同COL3>0.05
内容的名称时,将放置bCOL4
- 当
的Name
行具有all
和COL1=0
COL2``或
COL3>0.05
至少有一个名称在不同组中具有与相同名称相同的和
内容时,将放入XCOL4
- 当
的Name
行具有all
和COL1=0
COL2
或
COL3>0.05
在不同组中没有与同一名称具有相同内容的和
名称时,将放置xCOL4
- 如果
组中没有
,则输入NA名称
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