8

ベース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"  

さらに悪いことに、変数のリストには、行った選択操作が反映されておらず、列名として 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 の変数/列の現在の名前を抽出する単純で簡単な方法があります。これnames()はベース r のラです。

4

1 に答える 1