【问题标题】:R: if statements in loopR:循环中的 if 语句
【发布时间】:2016-03-05 06:30:41
【问题描述】:

基本上是对this问题的跟进。

我仍在尝试掌握 R 的矢量化,同时尝试加快同事的代码。我读过R infernoSpeed 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


【解决方案1】:

由于转换为因子(强制其他字母为零),这会在表格中为您提供所需的结果,但计算效率低于仅使用 apply 和 table。

res <- t(apply(df3[,-c(1:2)],1,function(x){
  x_f=factor(x, levels=c("N","O","X"))
  return(table(x_f))
}))

> res
  N O X
1 0 6 0
2 0 6 0

对于较小的数据集,首先融合数据可能是一种选择,但对于 1e6 行和 100 列,您需要大量内存。

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 2021-03-06
    • 1970-01-01
    • 2017-06-02
    • 2020-05-25
    相关资源
    最近更新 更多