为什么R允许引用未引用的数据框中的列?

时间:2018-11-29 20:46:04

标签: r pandas dplyr data.table

例如,在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))]

总而言之,我的感觉是,与熊猫相比,R中的数据整理并非一帆风顺/自然。有人可以解释一下这有什么好处吗?

1 个答案:

答案 0 :(得分:2)

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

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…

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