r - 使用 dplyr 和列中的一些条件创建一个新的数据框
问题描述
你好这里是一个数据框
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
这是dput
:
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"))
并从这个数据框中我想得到另一个数据框,例如:
G1 G2
SP1 A B
SP2 x x
SP3 x NA
SP4 NA NA
SP5 A X
SP6 a x
SP7 NA b
这个想法是让每个组添加行中存在的名称并在单元格中添加字母 A、B、X 或 NA,如果我们在 anotger 中找到至少一个物种的相同 COL4 值,则大写或小写将取决于团体。
- 当
any
的行Name
有一个COL1 >0
并且至少有一个名称与COL4
不同组中的相同名称具有相同的内容时,放置 A - 当
any
的行Name
具有 aCOL1 >0
并且没有与COL4
不同组中的相同名称具有相同内容的名称时放置 a - B 是当
any
行Name
有一个COL1=0
ANDCOL2
AND
COL3 > 0.05
AND 有至少一个 Names 与COL4
不同 Groups 中的相同 Name 具有相同的内容 - b 被放置当
any
行Name
具有COL1=0
ANDCOL2
AND
COL3 > 0.05
AND 没有名称与COL4
不同组中的相同名称具有相同内容时 - X 被放置当
all
行Name
有一个COL1=0
ANDCOL2``OR
COL3 > 0.05
AND
至少有一个名称与COL4
不同组中的相同名称具有相同的内容 - x 放置
all
在行Name
有一个COL1=0
并且COL2
OR
COL3 > 0.05
AND
没有名称与COL4
不同组中的相同名称具有相同内容的情况下 - NA 中没有时
Name
放入Group
让我们举4个例子:
1)我们看到G1-SP1
有row1
一个COL1 > 0
,那么它将有一个字母A
或a
在新的数据框中。现在为了知道它是 anA
还是 ana
我们必须查看 the COL4
,我们看到row12
the Sequence3
中也存在G2
for the SP1
,所以它将是一个 'A'
2)我们看到G2-SP1
有row12
aCOL2
和COL3
are > 0.05
,那么它将有一个字母B
或b
在新的数据框中。这将是B
因为在SP1的G2G1
中也存在 。row3
Sequence3
3)我们看到G2-SP2
none 行有COL1 >0X
orCOL2
和COL3
are > 0.05
,那么它将在新数据框中有一个字母B
or x
。这将是x
因为SP2
其他Groups
人都没有相同的序列`(Sequence22,Sequence23或Sequence24)
4)我们看到G1-SP6
有row8
一个COL1 > 0
,那么它将有一个字母A
或a
在新的数据框中。这将是a
因为其他人中没有其他SP1
人Groups
具有相同的序列(Sequence20)
`
感谢 Dan Chaltiel:使用 dplyr 根据阈值创建新的数据帧我得到了不包含小写/大写变量的代码:
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)
使用此代码,我可以得到:
G1 G2
SP1 A B
SP2 X X
SP3 X NA
SP4 NA NA
SP5 A X
SP6 A X
SP7 NA B
解决方案
推荐阅读
- ruby-on-rails - 升级到 Rails 6 时 Active Storage 迁移出现错误
- kubernetes - Kubernetes——如果configmap改变了如何触发job?
- javascript - 异步调度完成后如何在组件中执行方法(thunk 或动作创建者)?
- javascript - 何在页面加载时在 div 上显示“欢迎”5 秒,然后使用 jquery 显示 div?
- sql - 我正在尝试调整 SQL 查询以获得更好的性能
- postman - 如何从 Postman 请求中读取文件名
- visual-studio - QtCreator 到 VS2015 的快捷方式
- sql-server - 导出 blob 需要哪些权限
- laravel - 使用 Laravel 进行 API 版本控制和身份验证
- notepad++ - Notepad++:在现有变量行之间添加几行