我想在我的数据框中每2列添加一个新列,基于这2列的值。数据框有70列和超过60k行。下面是一个小例子,其中样本作为列名(FF1,FFPE1等),基因在行中:
> gene<-c("gene1", "gene2", "gene3", "gene4")
> FF1<-c(10,20,30,40)
> FFPE1<-c(10,9,2,1)
> FF2<-c(0,2,50,60)
> FFPE2<-c(10,10,100,200)
> expression<-data.frame(gene, FF1, FFPE1, FF2, FFPE2)
> expression
gene FF1 FFPE1 FF2 FFPE2
1 gene1 10 10 0 10
2 gene2 20 9 2 10
3 gene3 30 2 50 100
4 gene4 40 1 60 200
我想评估每个配对样本。如果该基因的两个样本的值都大于5,则新列在该点处将具有3。如果FF样本大于5但FFPE不大于5,则新列将获得1。如果FFPE样本大于5但FF样本不大于5,则新列将获得2。它看起来如下所示:
> group1<-c(3,3,1,1)
> group2<-c(2,2,3,3)
> expression<-data.frame(expression, group1, group2)
> expression
gene FF1 FFPE1 FF2 FFPE2 group1 group2
1 gene1 10 10 0 10 3 2
2 gene2 20 9 2 10 3 2
3 gene3 30 2 50 100 1 3
4 gene4 40 1 60 200 1 3
但我不会手动添加新的组列。
有什么建议吗?我发现了基于多个条件的类似问题,但他们只创建了1个新列。或者相反,他们只基于df中已有的一个列创建了多个新列。我想过使用mutate
和case_when
,但我不知道如何为每2列执行此操作。
4条答案
按热度按时间ccrfmcuu1#
对于这样的问题,我们可以使用'dplyover'包。免责声明:我是维护者,它不在CRAN上。
一种方法是使用
dplyover::across2
来选择要循环的列对。为了选择列对,我们使用带有matches()
的正则表达式。在.fns
中的函数中,我们使用.x
作为第一列,.y
作为第二列。注意,列的顺序必须正确。dplyover::over()
是一种更保存编程时间的方法,在这里我们循环一个字符串并动态地构造列名,所以列的顺序并不重要。我们使用
extract_names
来获取结束列数字,然后我们可以在.()
函数的字符串中构造列名,其中{.x}
被计算为循环中的当前数字。数据来自OP
创建于2023-04-03带有reprex v2.0.2
yk9xbfzb2#
下面是另一种实现你想要的东西的方法:
输出:
3zwjbxry3#
你可以试试这个:
我将使用与@asaei类似的方法。为了使pivot_longer更容易,我更改了一些名称,FF 1到FF_1.....区别在于
mutate()
的内部8ftvxx2r4#
基R方法:
这通过
split.default
按列拆分data.frame,并使用apply
函数进行一些值匹配。