【问题标题】:Faster Alternative for looping in combination with If in R与 R 中的 If 结合使用的更快循环替代方案
【发布时间】:2020-08-06 12:55:29
【问题描述】:

我有一个包含 2,000,000 + 行和 22 列的数据框。 在三列中,条目是 0、1 或 NA。 我想要一列,每一行都有这三列的总和,将 NA 视为 0。 使用 for 循环肯定太慢了。

你有其他选择吗?另一个想法是在管道中使用 mutate,但我在选择要按名称相加的列时遇到问题。

第一次尝试:

for(i in 1:nrow(T12)){

  if(is.na(T12$blue[i])  & is.na(T12$blue.y[i])) {
  
    T12$blue[i] <- T12$blue.x[i]
  
  }else if(is.na(T12$blue[i])  & is.na(T12$blue.x[i])){
  
  
    T12$blue[i] <- T12$blue.y[i]
  }else if(is.na(T12$blue[i])  & is.na(T12$blue.x[i]) & is.na(T12$blue.y[i]) )
    T12[i,] <- NULL
}

谢谢!

【问题讨论】:

    标签: r dataframe loops tidy


    【解决方案1】:

    我将假设您要添加的列是前三列。如果您需要不同的列,只需在下面的代码中更改c(1,2,3)

    apply(T12[,c(1,2,3)], 1, sum, na.rm=TRUE)
    

    注意:@27ϕ9 cmets 更快的解决方案是

    rowSums(T12[,c(1,2,3)], 1, na.rm=TRUE)
    

    【讨论】:

    • 在我的数据框中没有特定的列是数字 8,15,22。它们需要通过名称来检测。
    • 为什么不能用 c(8,15,22) 替换 c(1,2,3) ?你需要的名字是 blue、blue.x 和 blue.y 吗?
    【解决方案2】:

    您可以先将所有 NA 替换为 0。

    df[is.na(df)] <- 0
    setDT(df)[,newcol := a + b + c]
    

    【讨论】:

      【解决方案3】:

      如果你的对象列名是abc,也许你可以试试下面的代码

      within(T12, new <- rowSums(cbind(a,b,c),na.rm = TRUE))
      

      【讨论】:

        猜你喜欢
        • 2020-11-14
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        • 2014-08-27
        • 1970-01-01
        • 2018-10-03
        相关资源
        最近更新 更多