我正在寻找一个有效的方法,从一个SF对象提取一个单一的功能,当功能作为变量名。如果我们有一个sf-object,比如:
g = st_as_sf(data.frame(x = 1:5, y = 5:1, a = 6:10, b = 11:15), coords = c("x", "y"))
我们可以很容易地用g$a
提取列a。但是,我想知道如果我想使用变量colname = "a"
,提取列a
的最有效方法是什么。g[,colname]将返回一个sf-object,其中a
是唯一的特征。可以将对象转换为data.frame,然后使用data.frame(g)[, colname]
提取列。然而,这不是非常有效的。如microbenchmark所示:
microbenchmark(g$a, data.frame(g)[, "a"])
当然,在这种情况下,纳秒很少引起人们的兴趣,但对于频繁提取较大对象,对data.frame(g)的调用将对总运行时间产生影响。在这种情况下,除了创建另一个对象gg=data.frame(g)
之外,还有更有效的方法吗?
3条答案
按热度按时间hi3rlvi21#
由于
sf
仍然是data.frame
(或tibble
),因此不需要手动转换。只需在[]
和[[]]
之间切换,具体取决于您是否需要一个列作为矢量或sf
对象,该对象具有单个特征,其中几何体仍然附加:创建于2023-05-12带有reprex v2.0.2
iovurdzv2#
怎么样
...如果你想保留属性a加上几何体?
如果实际上要删除几何体(将要素转换为非空间数据框行),可以通过以下方式执行:
9udxz4iz3#
我想到了几种可能性,但从基准测试的Angular 来看,没有一种是真正的游戏改变者。
{sf}
的[
方法(参数drop
设置为true)似乎是最快的,但仍然不能与美元符号运算符相比。