【发布时间】:2022-06-18 00:03:20
【问题描述】:
我有以下数据框(我的真实数据框有更多的行和列,但表面上是这样构造的):
Root_R1 = c(1,2,3,4,5)
Root_R2 = c(1,0,3,0,0)
Root_R3 = c(1,0,3,0,0)
Shoot_R1 = c(1,0,3,4,5)
Shoot_R2 = c(0,0,31,4,5)
Shoot_R3 = c(0,0,0,0,0)
data.frame(Root_R1, Root_R2, Root_R3, Shoot_R1, Shoot_R2, Shoot_R3)
Root_R1 Root_R2 Root_R3 Shoot_R1 Shoot_R2 Shoot_R3
1 Root Root Root Shoot Shoot Shoot
2 1 1 1 1 0 0
3 2 0 0 0 0 0
4 3 3 3 3 31 0
5 4 0 0 4 4 0
6 5 0 0 5 5 0
我想要做的是过滤此数据框并找到与组织类型(根、芽等)关联的至少两列的值大于 0 的所有行。因此,对于与“Roots”(第 1、2、3 列)关联的列,应返回第 1 - 3 行,而与“Shoots”关联的列将返回第 4 - 6 行。我认为ifelse 代码会起作用,但这似乎效率低下。来自dplyr 的filter 会更合适吗?
【问题讨论】:
-
在向量中混合字符串和数字是个坏主意,它们都会变成字符。
-
明白。如果我制作了相同的数据框但听取了您的建议(从我的 df 中删除“Root”和“Shoot”并使用“Root_R1”作为列标题,您建议的以下解决方案会改变吗?
-
是的,它将不再需要第一条指令 (
df1 <- df1[-1,])。在df1[]<-lapply循环中也不强制转换为整数。这个循环不会有什么坏处,但也不需要。 -
明白了。假设我想更改截止的数值,我会更改这部分代码
(sum(x > 0L)),如果我想更改符合截止的行数,我会更改:@987654328 @? -
是的,就是这样。或者写一个函数。我将编辑我的答案来预测这些情况。
标签: r if-statement filter subset