【问题标题】:How to not use loops & IF-statements in R如何在 R 中不使用循环和 IF 语句
【发布时间】:2016-02-05 14:15:03
【问题描述】:

我在 R 中有两个数据框,一个很大但不完整(导入),我想创建一个更小、更完整的子集(导出)。 $unique_name 列中的每个 ID 都是唯一的,不会出现两次。其他列可能是例如体重,但也可能是与唯一 ID 对应的其他类别。我已经编写了这段代码,一个双循环和一个 if 语句,它确实有效,但速度很慢:

for (j in 1:length(export$unique_name)){
  for (i in 1:length(import$unique_name)){
    if (toString(export$unique_name[j]) == toString(import$unique_name[i])){
      export$body_mass[j] <- import$body_mass[i]
    }
  }
}

我对 R 不是很好,但我知道这是一种不好的方法。关于如何使用 apply() 或 plyr 包之类的函数来实现它的任何提示?

比约恩

【问题讨论】:

  • merge。这是一个连接操作。
  • 我可能会误解,但这不只是 export
  • 感谢 A.Webb,正是我所需要的。

标签: r loops nested apply


【解决方案1】:

有很多功能可以做到这一点。看看..

library(compare)
compare(DF1,DF2,allowAll=TRUE)

或者如@A.Webb 提到的Merge 是非常方便的功能。

merge(x = DF1, y = DF2, by.x = "Unique_ID",by.y = "Unique_ID", all.x = T, sort = F)

如果你更喜欢 SQL 风格的语句,那么

library(sqldf)
sqldf('SELECT * FROM DF1 INTERSECT SELECT * FROM DF2')

易于实施并避免forif 条件

【讨论】:

  • 感谢您的帮助(以及其他所有人)。就像你和 A.Webb 说的,Merge() 正是我要找的!这让事情变得非常简单。
【解决方案2】:

正如 A.Webb 建议的那样,您需要加入:

    # join data on unique_name
    joined=merge(export, import[c("unique_name", "body_mass")], c('unique_name')) 
    joined$body_mass=joined$body_mass.y  # update  body_mass  from import to export
    joined$body_mass.x=NULL  # remove not needed column
    joined$body_mass.y=NULL  # remove not needed column
    export=joined;

【讨论】:

    【解决方案3】:

    注意:如下图使用“which”函数。这样会减少循环迭代次数

    for (j in 1 : nrow(export)){
              index<- which(import$unique_name %in% export$unique_name[j])
              if(length(index)=1)
              {
                export$body_mass[j] <- import[index[1],"body_mass"]
              }
            }
    

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 2016-03-05
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2017-08-20
      相关资源
      最近更新 更多