【问题标题】:Checking whether a row name exists in a data frame?检查数据框中是否存在行名?
【发布时间】:2023-03-11 18:35:01
【问题描述】:

我想通过字符串名称来寻址数据框的行,并且表格将按顺序构建。我想做类似的事情

> mytab <- data.frame(city=c("tokyo","delhi","lima"),price=c(9,8,7),row.names=1)
> mytab
      price
tokyo     9
delhi     8
lima      7 
> # I can add a new row
> mytab["london",] = 8.5

我现在需要检查一个行名是否已经存在。

> mytab["ny",]
[1] NA

除了

,我还能做什么?

&gt; if (is.na(mytab["ny",])) { mytab["ny",]=9;}

因为NA 可能会以其他方式出现?

【问题讨论】:

    标签: r dataframe rowname


    【解决方案1】:

    类似的东西

    if (!('ny' %in% row.names(mytab))) {mytab['ny',]=9}
    

    可能会成功。

    【讨论】:

    • 应该这样做,但由于线性搜索,这似乎将具有O(n) 时间复杂度,并且由于形成row.names(mytab) 可能是O(n) 空间复杂度。这是真的?行名搜索总是线性搜索吗?
    • @highBandWidth - sungam 有一个相当快的答案,但每次查找确实是 O(n)。您的评论让我想知道:您是否要测试多个行名,如果是,您可以一次性完成吗?
    【解决方案2】:

    有很多方法可以做到这一点。最简单的方法之一是像这样使用 any() 函数:

    # Returns true if any of the row names is 'lima', false otherwise.
    any(row.names(mytab) == 'lima')
    

    由于这会返回一个布尔值,因此您可以根据需要从中分支条件。

    【讨论】:

    • 谢谢!我想你的意思是any(row.names(mytab) == 'lima')。我猜它与@sungam 的方法相同。你知道常规的行名查找是否比线性搜索更好吗?
    • 应该是any(row.names(mytab) == 'lima')
    【解决方案3】:

    如果您想一次检查多个城市,这里有一种稍微不同的方法。这可以帮助加快速度...

    mytab <- data.frame(city=c("tokyo","delhi","lima"),price=c(9,8,7),row.names=1)
    
    # Check several cities in one go:
    newcities <- c('foo', 'delhi', 'bar')
    
    # Returns the missing cities:
    setdiff(newcities, row.names(mytab))
    #[1] "foo" "bar"
    
    # Returns the existing cities:
    intersect(newcities, row.names(mytab))
    #[1] "delhi"
    

    【讨论】:

      猜你喜欢
      • 2020-09-24
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2021-05-19
      • 2017-02-15
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多