[英]Multiply values in a dataset by values in another dataset in R
我有兩個數據集,它們既共享一個公共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名稱取消列出這兩個數據集? 可以使用什么函數將兩個數據集中的值相乘?
我假設您正在嘗試返回第三個數據幀,該數據幀將在每個位置具有兩個數據幀中該位置的值的乘積。
例如,如果以下是您的兩個數據框
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
將起作用(只要兩個數據幀的大小相等)。
如果您的數據框具有相同的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.