r - 在sparklyr (R+spark) 中提取列名称的简单命令

标签 r apache-spark dplyr sparklyr

在基 r 中,很容易从数据框中提取列(变量)的名称

> testdf <- data.frame(a1 = rnorm(1e5), a2 = rnorm(1e5), a3 = rnorm(1e5), a4 = rnorm(1e5), a5 = rnorm(1e5), a6 = rnorm(1e5))  
> names(testdf)  
[1] "a1" "a2" "a3" "a4" "a5" "a6"

但是当使用sparklyr时,事情变得更加复杂。将数据框复制到spark后,

> testdf_tbl <- copy_to(sc, testdf, overwrite = TRUE)  
> names(testdf_tbl)  
[1] "src" "ops"

变量名实际上位于“ops”深处

> testdf_tbl$ops$vars  
[1] "a1" "a2" "a3" "a4" "a5" "a6"

如果这就是全部,那就没有问题了(也不需要问这个问题)。但是,每次对 testdf_tbl 进行操作时,列/变量的名称都会更改其位置,如下所示。

> testdf_tbl <- testdf_tbl %>% select(-a1)  
> testdf_tbl$ops$vars  
NULL  
> testdf_tbl$ops$x$vars  
[1] "a1" "a2" "a3" "a4" "a5" "a6"  

另一个操作将另一个 $x 添加到路径中......等等。

> testdf_tbl <- testdf_tbl %>% select(-a2)  
> testdf_tbl$ops$x$vars  
NULL  
> testdf_tbl$ops$x$x$vars  
[1] "a1" "a2" "a3" "a4" "a5" "a6"  

更糟糕的是,变量列表并没有反射(reflect)我们所做的选择操作,它们仍然列出 a1、a2 作为列名。其中,

> head(testdf_tbl)  
Source:   query [?? x 4]  
Database: spark connection master=local[24] app=sparklyr local=TRUE  
        a3           a4          a5         a6  
        dbl          dbl         dbl        dbl  
1 -1.146368875  1.691698406  0.43231629  1.3349111  
2  0.664928710 -1.332242020  0.05380729  1.0139253  
3  1.158095695 -0.097098980 -0.61885204  0.1504693  
4  0.001595841 -0.003765908  0.27935192 -0.3039085  
5 -0.133446040  0.269329076  1.57210274  1.7762602  
6  0.006468698 -1.300439537  0.74057307  0.1320428  

很明显,选择操作对 Spark 数据帧的使用方式产生了影响。

当然,有一种简单、直接的方法可以提取 Sparklyr 中变量/列的当前名称,就像基本 r 中的 names() 一样。

最佳答案

正如 Kevin 所说,tbl_vars 可以工作,但如果您希望它更像“base-R”,colnames 也可以。

关于r - 在sparklyr (R+spark) 中提取列名称的简单命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39978958/

相关文章:

arrays - 如何创建和绑定(bind)空多维数组

r - 使用函数中的列名称列表进行 Tidyeval

python - Pyspark UDF 中自定义 Python 对象的使用

sql-server - 如何使用 dplyr 连接 SQL Server 中表中多列的字符串?

regex - 从R中的url路径获取文件名

Rbinding 大量数据帧

python - 如何使用Python在Spark中对线性回归进行一次热编码?

apache-spark - 如何设置 pod 以使用所有可用的 CPU 内核

r - 将观察数据框转化为等级

r - 在 dplyr 中模拟时间序列而不是使用 for 循环