我有两个数据集,它们既共享公共ID变量,又共享 n 变量,分别表示为SNP1-SNP n 。下面显示了两个数据集的示例
数据集1
ID SNP1 SNP2 SNP3 SNP4 SNP5 SNP6 SNP7
1 0 1 1 0 0 0 0
2 1 1 0 0 0 0 0
3 1 0 0 0 1 1 0
4 0 1 1 0 0 0 0
5 1 0 0 0 1 1 0
6 1 0 0 0 1 1 0
7 0 1 1 0 0 0 0
数据集2
ID SNP1 SNP2 SNP3 SNP4 SNP5 SNP6 SNP7
1 0.65 1.3 2.8 0.43 0.62 0.9 1.5
2 0.74 1.6 3.4 0.9 2.4 4.4 2.3
3 0.28 0.5 5.7 6.7 0.3 2.5 0.56
4 0.74 1.6 3.4 0.9 2.4 4.4 2.3
5 0.65 1.3 2.8 0.43 0.62 0.9 1.5
6 0.74 1.6 3.4 0.9 2.4 4.4 2.3
7 0.28 0.5 5.7 6.7 0.3 2.5 0.56
我想将数据帧1中给定位置的每个值与数据帧2中等效位置的值相乘。
例如,我想将数据集1(值= 0)中的位置[1,2]乘以数据集2(值= 0.65)中的位置[1,2]。我的数据集非常大,涵盖了将近300列和500,000个ID。
SNP1- n 的可变名称实际上更长(例如,它们实际上读为Affx.5869593),所以我不能只在我的代码中使用SNP1-300,它必须由列数。
我是否需要先按人员ID和SNP名称取消列出这两个数据集?可以使用什么函数将两个数据集中的值相乘?
答案 0 :(得分:0)
我假设您正在尝试返回第三个数据帧,该数据帧将在每个位置具有两个数据帧中该位置的值的乘积。
例如,如果以下是您的两个数据框
df1 <- structure(list(ID = c(1, 2, 3, 4, 5), SNP1a = c(0, 1, 1, 0, 1
), SNP2a = c(1, 1, 0, 1, 0)), class = "data.frame", row.names = c(NA,
-5L))
ID SNP1a SNP2a
1 0 1
2 1 1
3 1 0
4 0 1
5 1 0
df2 <- structure(list(ID = c(1, 2, 3, 4, 5), SNP1b = c(0.65, 0.74,
0.28, 0.74, 0.65), SNP2b = c(1.3, 1.6, 0.5, 1.6, 1.3)), class = .
"data.frame", row.names = c(NA, -5L))
ID SNP1b SNP2b
1 0.65 1.3
2 0.74 1.6
3 0.28 0.5
4 0.74 1.6
5 0.65 1.3
然后
df3 <- df1[,2:3] * df2[,2:3]
SNP1 SNP2
1 0.00 1.3
2 0.74 1.6
3 0.28 0.0
4 0.00 1.6
5 0.65 0.0
将起作用(只要两个数据帧的大小相等)。
答案 1 :(得分:0)
如果您的数据框具有相同的ID集并且大小相同,则可以同时对ID进行排序并执行以下操作:
df <- data.frame(
id = c(1,2,3,4,5),
snp1 = c(0,0,1,0,0),
snp2 = c(1,1,1,0,1)
)
df2 <- data.frame(
id <- c(1,2,3,4,5),
snp1 <- c(0.3,0.2,0.3,0.1,0.2),
snp2 <- c(0.5,0.8,0.2,0.3,0.3)
)
res <- mapply(`*`, df[,-1], df2[,-1)
res$id <- df$id