【问题标题】:Why does R allow to refer to a column in a data frame unquoted? [closed]为什么 R 允许引用数据框中未引用的列? [关闭]
【发布时间】:2018-11-29 20:46:04
【问题描述】:

例如,在 Pandas 中,您总是需要通过字符串中的名称来引用 DataFrame 中的列:

df = pd.DataFrame(list(range(1,10)),columns = ["a"])
df["a"]

但是在 R 中,包括它的一些包,例如 data.table 和 dplyr,您可以引用不带引号的列,就像这样:

dt <- data.table(a = 1:10)
dt[,.(a)]

在我看来,引用未引用的列名是一场灾难。您获得的唯一好处是您无需输入""。但缺点是无限的:

1) 您经常需要以编程方式选择列。如果列名不加引号,您需要区分“外部”和“内部”上下文中的变量。

col_name <- "a"
dt[,..col_name]

2) 即使您设法选择在字符串向量中指定的列,也很难对它们进行(复杂)操作。在this question中提到,你需要这样做:

diststr = "dist"
valstr = "val"

x[get(valstr) < 5, c(diststr) := 
get(diststr)*sum(get(diststr))]

总而言之,我的感觉是,与在 pandas 中完成的方式相比,在 R 中处理数据根本不简单/自然。有人可以解释一下这有什么好处吗?

【问题讨论】:

  • 但从基础 R 也可以看到 with()within()subset()、模型公式,...非标准评估的优点和缺点是巨大的蠕虫罐头,但我投票决定以基于意见的方式关闭......
  • 这是基于意见的,但“缺点是无限的”是错误的。我对data.table 不太熟悉,但dplyr 的评估是完全明确的。是的,这是为了节省打字。键入 "" 需要 2 到 4 次击键(如果您使用 Rstudio,则为 2 次),当您必须键入这么多变量时,它会变得很多。
  • 同样在 Rstudio 中,不带引号的变量允许使用选项卡自动完成变量名,而这在字符串中可能是不可能的。

标签: r pandas dplyr data.table


【解决方案1】:

在 Pandas 中,您可以引用不带引号的适当命名的列,例如:

df = pd.DataFrame(dict(
  a=[1,2,3],
  b=[5,6,7],
))
print(df.a)

在 R 中有效、简洁且语法相似。

选择取决于代码作者对数据集的了解程度以及当时的便利性 - 对于快速分析来说这很好,对于更多可重复的工作流程来说这可能会很尴尬。

在处理数据库时,我也经常使用不带引号的变量访问器——列名基本上总是有效的标识符

df = pd.read_sql('select a, b from foo', dbcon)
df.a

df <- dbGetQuery(dbcon, 'select a, b from foo')
df$a

分别用于 Pandas 和 R……

每种语言/库都提供工具,您可以适当地使用它们!

【讨论】:

    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多