2017-02-20 3 views
0

にデータフレームから変数名を使用:私はこのようになりますいくつかのデータを持って操作

dfA <- data.frame("First Var Name" = rnorm(20,3), 
        "Second Var Name" = rnorm(20,5), 
        "Third Var Name" = rnorm(20,4), 
        "Fourth Var Name" = rnorm(20,4)) 

dfB <- data.frame(Grouping = c("A","B","B","A"), 
        Varname = c("First Var Name", "Second Var Name", "Third Var Name", "Fourth Var Name")) 

を私は、そのグループ内の変数の最初の主要なコンポーネントを取り、group_byグループにdplyrでDFBを使用したいですdfAに適用されます。

dfC <- dfB %>% 
    group_by(Grouping) %>% 
    relevantvars <- .$Varname %>% 
    data.frame(`Grouping' = prcomp(dfA[,relevantvars])$x[,1]) 

しかし、変数名を取得し、変数名としてグループ化することは難しいことが分かりました。私もpasteコマンドと組み合わせて試しましたが、それもうまくいきませんでした。ここで私は得るために期待していますものです:

dfC <- data.frame(A = prcomp(dfA[,c(1,4)])$x[,1], B = prcomp(dfA[,c(2,3)])$x[,1]) 
+2

あなたは文字値として格納された変数名がある場合は、例えば、dplyrの標準的な評価バリアントを使用する必要があります'group_by_'です。 [the NSE vignette](https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html)を参照してください。 – alistaire

+0

また、スペースの名前を列に付けておくと、膨大な量のバッククォートを必要とするため、dplyrのNSEはいくらか意味がありません。 – alistaire

+0

これはデータがRに入った方法ですが、これはdplyrを使う前に変更することができますが、可能な限り元のデータを真似しようとしていました。 NSEを見ていきましょう、ありがとう。 – Almacomet

答えて

0

あなたが実際には、これらの変数によってグループにしたくありません。値を名前でグループ化する必要があります。 dfAを長形に変更し、各PCAに必要なデータをdata.framesのリスト列としてネストすると、より簡単に実現できます。purrr::mapを使用して繰り返し処理できます(好きな場合はlapply)。 prcompの場合は、ワイドに変更する必要があります。この場合は、unstacktidyr::spreadよりも簡単です。これはインデックスについては細心の注意を払っています。

library(tidyverse) 

set.seed(47) # make generated data reproducible 

dfA <- data.frame(`First Var Name` = rnorm(20, 3), 
        `Second Var Name` = rnorm(20, 5), 
        `Third Var Name` = rnorm(20, 4), 
        `Fourth Var Name` = rnorm(20, 4)) 

dfB <- data.frame(Grouping = c("A", "B", "B", "A"), 
        Varname = c("First Var Name", "Second Var Name", "Third Var Name", "Fourth Var Name")) 

# unless you tell it not to, `data.frame` will replace spaces with periods, so update Varname 
dfB <- dfB %>% mutate(Varname = make.names(Varname)) 

dfC <- dfA %>% gather() %>% 
    left_join(dfB, by = c("key" = "Varname")) %>% 
    nest(-Grouping) %>% 
    mutate(pca = map(data, ~prcomp(unstack(.x, value ~ key))$x[, 1])) %>% 
    unnest(pca) %>% 
    unstack(pca ~ Grouping) 

dfC 
#>    A   B 
#> 1 -1.74340058 -0.80430828 
#> 2 -0.90015763 0.55121748 
#> 3 0.72162180 0.18540745 
#> 4 0.68609468 -0.11332615 
#> 5 -0.68003234 0.43964407 
#> 6 1.39659346 0.37532545 
#> 7 1.08617617 -1.44789829 
#> 8 0.61576966 -1.01015131 
#> 9 -1.09667280 -1.78978142 
#> 10 1.14931837 -0.16714979 
#> 11 1.02694416 -0.08245775 
#> 12 0.03852488 -0.83134735 
#> 13 0.05820030 -1.97289196 
#> 14 2.35215929 1.62823022 
#> 15 -0.38723810 2.24902954 
#> 16 -1.65000542 -0.43809477 
#> 17 0.19792790 0.47133845 
#> 18 -0.89921705 0.85804619 
#> 19 -0.88727866 1.01371806 
#> 20 -1.08532810 0.88545017 
関連する問題