【发布时间】:2016-03-05 06:30:41
【问题描述】:
基本上是对this问题的跟进。
我仍在尝试掌握 R 的矢量化,同时尝试加快同事的代码。我读过R inferno 和Speed up the loop operation in R。
我的目标是加快以下代码的速度,完整的数据集包含约 1000 列乘以 10.000-1.000.000 行:
df3 <- structure(c("X", "X", "X", "X", "O", "O", "O", "O", "O", "O",
"O", "O", "O", "O", "O", "O"), .Dim = c(2L, 8L), .Dimnames = list(
c("1", "2"), c("pig_id", "code", "DSFASD32", "SDFSD56",
"SDFASD12", "SDFSD56342", "SDFASD12231", "SDFASD45442"
)))
score_1 <- structure(c(0, 0, 0, 0, 0, 0), .Dim = 2:3)
for (i in 1:nrow(df3)) {
a<-matrix(table(df3[i,3:ncol(df3)]))
if (nrow(a)==1) {
score_1[i,1]<-0 #count number of X (error), N (not compared) and O (ok)
score_1[i,2]<-a[1,1]
}
if (nrow(a)==2) {
score_1[i,1]<-a[1,1]
score_1[i,2]<-a[2,1]
}
if (nrow(a)==3) {
score_1[i,1]<-a[1,1]
score_1[i,2]<-a[2,1]
score_1[i,3]<-a[3,1]
}
}
colnames(score_1) <- c("N", "O", "X")
我一直在尝试自己,但似乎还无法弄清楚。 这是我尝试过的。它显示与上面的代码相同的输出,但我不确定它是否真的这样做。我缺少对 R 和我的数据集的那一点洞察力。
我似乎无法让我的代码获得与 for 循环相同的输出。
编辑: 为了回应 Herka 的回复,我更新了我的可重现示例:
for循环的输出:
[,1] [,2] [,3]
[1,] 0 6 0
[2,] 0 6 0
apply 函数的输出:
1 2
[1,] 6 6
【问题讨论】:
-
你能在这里写下你想做什么吗?
-
这让您很难找到解决方案,我真的不想通过所有代码试图弄清楚会发生什么。它看起来像是“X”、“O”和“N”的一种按行计数(不在示例数据中)。对吗?
-
t(apply(df3[,-c(1:2)],1,table))做你想做的事吗? -
i = 3时你的循环'错误'。t(apply(df3, 1, table))给出了字母的逐行计数 -
@Bas 我认为提供的代码不一定正确。例如,如果一行中只有一个唯一字符,它将被写入第二个结果列。不管是哪个角色。这里的数据可能有一些假设/规律,但这会让我很紧张。
标签: r loops if-statement matrix