r - 如何根据其他(数据)表中的信息组合行/添加它们的值?
问题描述
我将信息存储在两个数据框/data.tables 中,我想使用存储在第二个(我的查找表)中的信息在我的第一个中添加/折叠行。
我的第一个 data.table 看起来像这样:
ID Sample01 Sample02 Sample03
1 1 2 3
2 0 1 2
3 2 0 1
4 5 2 1
我的第二个 data.table(距离矩阵)看起来像这样:
0 12 4 1
12 0 3 5
4 3 0 6
1 5 6 0
如果第二个显示距离的属性小于 2,我想在我的第一个 data.table 中添加行的值。
然后它应该看起来像这样(添加了第 1 行和第 4 行,因为距离 <2):
ID Sample01 Sample02 Sample03
1 6 4 4
2 0 1 2
3 2 0 1
由于数据非常大,我更喜欢使用 data.table,但我也可以使用其他包,感谢任何帮助!
编辑:
这将是表 1 (dput) 的真实示例:
structure(list(v_j_cdr3 = c("TCRBV02-01-TCRBJ01-01-SLGGmhcLFF",
"TCRBV02-01-TCRBJ01-01-SLGhLmhcLFF", "TCRBV02-01-TCRBJ01-01-SLLLGchcLFF",
"TCRBV02-01-TCRBJ01-01-SLLmGmhcLFF"), HIP08805 = c(6.4439e-05,
0, 0, 8.69177e-05), HIP17837 = c(6.01681e-05, 0, 0, 0), Keck0006_MC1 = c(2.48385e-05,
4.96771e-05, 0, 0)), row.names = c(NA, -4L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x7ffb190066e0>)
这将是表 2 (dput) 的真实示例:
structure(list(`1` = c(0, 2, 3, 2), `2` = c(2, 0, 4, 3), `3` = c(3,
4, 0, 2), `4` = c(2, 3, 2, 0)), row.names = c(NA, -4L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x7ffb190066e0>)
Edit2:解决方案(不删除行,因为评论让我意识到我不应该这样做)。
diag(matrix) <- 99
pos <- which(matrix<2,arr.ind = T,useNames = F)
datasubset_raw <- datasubset
for(j in 1:nrow(pos)){datasubset[pos[j,1],] <- datasubset[pos[j,1],]+datasubset_raw[pos[j,2],]}
解决方案
显然你应该为你的数据集上的所有情况做一个循环,但这个想法可能会帮助你
df1 <- data.frame("ID"=c(1,2,3,4),"Sample01"=c(1,0,2,5),
"Sample02"=c(2,1,0,2),"Sample03"=c(3,2,0,1))
# df1
# ID Sample01 Sample02 Sample03
# 1 1 1 2 3
# 2 2 0 1 2
# 3 3 2 0 0
# 4 4 5 2 1
dist_matrix <- matrix(c(0,12,4,1,
12,0,3,5,
4,3,0,6,
1,5,6,0),nrow = 4,ncol = 4)
#> dist_matrix
# [,1] [,2] [,3] [,4]
#[1,] 0 12 4 1
#[2,] 12 0 3 5
#[3,] 4 3 0 6
#[4,] 1 5 6 0
假设您对条件的对角线不感兴趣,因此它应该 > 2
diag(dist_matrix) <- 999
距离 < 2(1 和 4)的位置
pos <- which(dist_matrix<=2,arr.ind = T,useNames = F)
# pos
# [,1] [,2]
# [1,] 4 1
# [2,] 1 4
for(i in 1:nrow(pos)){pos[i,] <- sort(pos[i,])} # sort
# pos
# [,1] [,2]
#[1,] 1 4
#[2,] 1 4
pos <- unique(pos) # your final vector
#pos
# [,1] [,2]
#[1,] 1 4
然后加起来
df1[pos[1],2:4] <- df1[pos[1],2:4]+df1[pos[2],2:4]
#df1
# ID Sample01 Sample02 Sample03
#1 1 6 4 4
#2 2 0 1 2
#3 3 2 0 0
#4 4 5 2 1
删除第 4 个位置
df1 <- df1[-pos[2],]
# df1
# ID Sample01 Sample02 Sample03
# 1 1 6 4 4
# 2 2 0 1 2
# 3 3 2 0 0
推荐阅读
- migration - 使用 Swift 将新类添加到现有已发布的 Realm 数据库中
- c# - WPF 在按钮单击时重新加载当前的 UserControl
- ibm-watson - 想在 IBM Watson 中创建新项目
- python - 数据框:值匹配条件的时间百分比
- r - 如何使用 R 中的正则表达式从字符串中提取文本?
- clojure - clojure:scheme 的 `set!` 的等价物是什么?
- regex - 从部分地址获取街道名称的最佳正则表达式
- c++ - 处理智能指针的错误
- protocol-buffers - 在 ESP-IDF 中使用 Google Protobuffers(C++)
- android - onActivityResult() 在我的代码中提供空数据以捕获图像并将其上传到 Firebase 存储