【发布时间】:2020-07-29 12:20:02
【问题描述】:
在 R 中,我有一个带有采样位置和条目的大型数据框(23344 行 x 89 列)。
值 1 表示:在此采样位置找到的对象 值 0 表示:在此采样位置找不到对象
要计算每个采样位置(节点)的度数/连接数,我想每行获取rowsum-1(因为这等于度数)并将该行中的 1 更改为价值。
此后我可以得到colSum() 来计算每个样本位置的总度数。
我的数据框的可重现示例:
loc1 <- c(1,0,1)
loc2 <- c(0,1,1)
loc3 <- c(1,1,0)
loc4 <- c(1,1,0)
loc5 <- c(0,1,0)
df <- data.frame(loc1, loc2, loc3, loc4, loc5)
# loc1 loc2 loc3 loc4 loc5
# 1 1 0 1 1 0
# 2 0 1 1 1 1
# 3 1 1 0 0 0
所需的输出如下所示
# loc1 loc2 loc3 loc4 loc5
# 1 2 0 2 2 0 #rowsum = 3 so change values>1 to 2
# 2 0 3 3 3 3 #rowsum = 4 so change values>1 to 3
# 3 1 1 0 0 0 #rowsum = 2 so change/keep values>1 to 1
我的代码可以运行,但速度很慢(包含 for 循环),那么有没有更好/更快的方法来做到这一点?我知道函数 rowSums() 可能是解决方案的一部分。
我目前的代码如下:
for (r in 1:nrow(df)){
df[r, df[r,] == 1] <- sum(df[r,]) - 1}
degrees_per_sample <- colSums(df)
【问题讨论】:
-
如果您的数据都是数字的,那么使用矩阵会更快。你可以做
df* (rowSums(df) - 1),但 df is a matrix 会更快