【问题标题】:R exists function?R存在函数吗?
【发布时间】:2011-10-09 05:31:42
【问题描述】:

您好,我想比较两个目录中的文件:

allfilenames <- list.files(path="../XYZ")  
names1=allfilenames[grep("XYZ_*",allfilenames)]
numfiles <- length(names1) 

allfilenames2 <- list.files(path="../ABC")  
names2=allfilenames2[grep("ABC_*",allfilenames2)]
numfiles <- length(names2) 

for(i in names1){
if(exists(i in names2){...}###?????
else...
}

is存在函数不对!是否有其他功能可以查看来自一个导演的文件是否存在于另一个导演中?

【问题讨论】:

  • 在索引中,最好使用grepl 而不是` grep. When there are no matches, grep` 返回一个空的数字向量,这会导致索引返回所有内容(而不是什么都没有)。

标签: function r loops statistics


【解决方案1】:

要测试一个字符串是否在另一个字符串中,使用%in%,例如:

names <- c("A", "B", "D")

"A" %in% names
[1] TRUE

"C" %in% names
[1] FALSE

exists 测试对象是否存在。在您的情况下,您只是想测试一个陈述是真还是假。

【讨论】:

    【解决方案2】:

    不是exists,而是file.exists


    回应卡斯滕。

    OP 的问题:

    是否有另一个功能可以查看[ ]是否来自一个目录的文件[y] 存在于对方?

    我的答案的扩展版本

    file.exists(file.path(some_other_dir, a_file_from_one_directory))
    

    这充分回答了这个问题。

    【讨论】:

    • file.exists 对 OP 的问题没有帮助。
    • @Karsten:叹息。是的,你只是缺乏想象力。
    • 感谢您帮助我发挥想象力,我相应地更改了我的投票。也许我应该多睡觉
    【解决方案3】:

    与其一一测试其中一个 file.name 向量中的元素,不如使用intersect

    intersect(names1, names2)
    

    您可以使用length( intersect(a,b) ) == 0 测试没有通用名称

    【讨论】:

      【解决方案4】:

      Jasmine,首先您可以直接为 list.files 指定一个模式,而不是使用 grep - 但无论如何,该模式都需要是一个正则表达式。然后您可以使用集合操作对您的文件名进行交集、并集或差异操作:

      # "^XYZ_" matches strings that START with "XYZ_"
      names1 <- list.files("../XYZ", pattern="^XYZ_")
      names2 <- list.files("../ABC", pattern="^ABC_")
      
      # The names in both folders
      commonNames <- intersect(names1, names2)
      
      # The names only in the first folder
      uniqueNames1 <- setdiff(names1, names2)
      
      # The names only in the second folder
      uniqueNames2 <- setdiff(names2, names1)
      
      # Loop and process...    
      for(i in commonNames) {
        #...
      }
      

      如果您仍想使用 grep,您可以使用 value=TRUE 来获取值。同样,模式不正确,所以应该是这样的:

      names2 <- grep("^ABC_", allfilenames2, value=TRUE)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 2018-03-19
        相关资源
        最近更新 更多