我有一个数据集
dt <- data.table(Score = c(0.33,0.34,00.3, -0.22, 0.232),
Id2 = c("0/0","0/1","1/0","0/0","0/0"),
Kps = c("0/1","0/0","1/1","0/1","0/0"),
Inr = c("0/0","0/1","1/1","0/0","0/1"))
我需要将基于Score列的每行的值替换为如下所示
- 如果为“0/0”或“1/1”,则
Score * 2
- 如果为“1/0”或“0/1”,则
Score
通常,它可以通过使用基函数来完成,如下所示
dt$Id2 <- dt$Score * 2
但在这里,我必须考虑每一行,我有大约1000列,所以只能用循环完成
预期产出
Score Id2 Kps Inr
0.330 0.66 0.330 0.66
0.340 0.340 0.68 0.340
0.300 0.300 0.6 0.6
-0.220 -0.44 -0.22 -0.44
0.232 0.464 0.464 0.232
有什么建议吗?
4条答案
按热度按时间tcbh2hod1#
由于输入为
data.table
,因此下面是使用data.table
的一种方法或者,另一种选择是使用命名向量
或者创建1和0的计数进行相乘
ctzwtxfj2#
这是一个
tidyverse
方式的解决方案。它使用一个data.frame
,并在第一步中使其变长。然后使用case_when
实现不同的条件。pivot_wider
把它带回了更广泛的格式。svmlkihl3#
使用
dplyr::across()
,你可以跨多列应用一个函数,它支持tidy selections,这样你就可以根据变量的名称或属性巧妙地选择变量。一个狡猾的方法
x8goxv8g4#
使用矩阵乘法:
使用更大的数据集进行基准测试:
与 dplyr 相比,矩阵乘法应给予3- 7倍: