Rに

2017-12-16 20 views
1
d1 <- data.frame(col_one = c(1,2,3),col_two = c(4, 5, 6)) 
d2 <- data.frame(col_one = c(1, 1, 1), col_two = c(6, 5, 4)) 
d3 <- data.frame(col_one = c(7, 1, 1), col_two = c(8, 5, 4)) 
my.list <- list(d1, d2,d3) 

for (i in 1:3) { 
    table<- lapply(my.list, function(data, count) { 
    sql <- 
     #sqldf(
     paste0(
      "select *,count(col_one) from data where col_one = ", 
      count," group by col_one" 
     ) 
     #) 
    print(sql) 
    }, 
    count = i) 
} 

出力lapply機能とリストを使用して:Rに

[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 

が期待:

[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 

どのように改善できますか?私は、私が望む新しいデータセットを作成するためにSQLを実行することを望みますが、成功していません。SQLステートメントに関連するリストのインデックスを知ることができます。別の簡単な方法がありますか?

私はこの方法の1つを試しました。

d1 <- data.frame(col_one = c(1,2,3),col_two = c(4, 5, 6)) 
d2 <- data.frame(col_one = c(3, 2, 1), col_two = c(6, 5, 4)) 
d3 <- data.frame(col_one = c(7, 2, 1), col_two = c(8, 5, 4)) 
my.list <- list(d1, d2,d3) 
seq_along(x) 
#for (i in 1:3) { 
    table<- lapply(seq_along(my.list), function(index) { 
    sql <- 
     sqldf(
     paste0(
      "select *,count(col_one) from my.list where col_one = ", 
      index," group by col_one" 
     ) 
    ) 
    print(sql) 
    }) 
#} 

出力:

[1] "select *,count(col_one) from my.list where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from my.list where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from my.list where col_one = 3 group by col_one" 

しかし、それはSQLを実行するためのデータセットを見つけることができません。

d1 <- data.frame(col_one = c(1,2,3),col_two = c(4, 5, 6)) 
d2 <- data.frame(col_one = c(1, 1, 1), col_two = c(6, 5, 4)) 
d3 <- data.frame(col_one = c(7, 1, 1), col_two = c(8, 5, 4)) 
my.list <- list(d1, d2,d3) 
table<- mapply(function(data, count) { 
    sql <- 
    sqldf(
    paste0(
     "select *,count(col_one) from data where col_one = ", 
     count," group by col_one" 
    ) 
) 
    print(sql) 
}, my.list, 1 
) 
+0

あなたは 'my.list'のインデックスと各の行数のために追加の列と一緒にすべてのデータフレームの列をバインドしようとしています。これは、結果をフィルタリングすることによって達成することができますか? (my.list [[i]])、my.list [[i]] do.call( "rbind"、lapply(seq_along(my.list)、function(i)cbind) ))) ' –

答えて

1

を私が正しく理解している場合、OPは、データのそれぞれについて、col_oneための分割表を作成したいと考えています。つまり、各data.frameのcol_oneに値1、2、または3が何回表示されるかを知りたがっています。my.list

としてはanother question of the OPmy answerで説明しG. Grothendieckによって示唆されているように、それは彼らがリストに分離しておくよりも、大きなdata.tableに同一の構造でdata.framesを組み合わせることがほとんど常により良いです。 BTWには、第3のquestion ("how to loop the dataframe using sqldf?")もあり、OPによってdata.framesのリストのヘルプが求められます。

大きなdata.tableにdata.framesを結合するには、rbindlist()関数が使用されます。追加されたID列dfは、各行の元のdata.frameを識別します。

library(data.table) 
rbindlist(my.list, idcol = "df") 
df col_one col_two 
1: 1  1  4 
2: 1  2  5 
3: 1  3  6 
4: 2  1  6 
5: 2  1  5 
6: 2  1  4 
7: 3  7  8 
8: 3  1  5 
9: 3  1  4 

今、私たちは簡単に集計を計算することができます。

rbindlist(my.list, idcol = "df")[, count_col_one := .N, by = .(df, col_one)][] 
df col_one col_two count_col_one 
1: 1  1  4    1 
2: 1  2  5    1 
3: 1  3  6    1 
4: 2  1  6    3 
5: 2  1  5    3 
6: 2  1  4    3 
7: 3  7  8    1 
8: 3  1  5    2 
9: 3  1  4    2 

このdata.table文はで、個々の値の発生をカウント各dfのは、特殊記号.Nを使用し、dfcol_oneでグループ化することで

質問では、OPは、col_oneに1、2、または3の出現回数をカウントするよう求めました。これが実際に意図されている場合は、7の値を削除する必要があります。

rbindlist(my.list, idcol = "df")[, count_col_one := .N, by = .(df, col_one)][ 
    col_one %in% 1:3] 
1

あなたが同時にdatacountsを反復する必要があります。 tidyverseで、私は)(purrr使っ:: MAP2をお勧めしますが、基本Rにあなたは、単に行うことができます:」

table<- mapply(function(data, count) { 
    sql <- 
     #sqldf(
     paste0(
     "select *,count(col_one) from data where col_one = ", 
     count," group by col_one" 
    ) 
    #) 
    print(sql) 
    }, my.list, 1:3 
) 
[1] "select *,count(col_one) from data where col_one = 1 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 2 group by col_one" 
[1] "select *,count(col_one) from data where col_one = 3 group by col_one" 
+0

あなたの助けをありがとう。私はどのキーワードを求めなければならないかわからないので、新しい機能を学びました。 関連する値を含むリストのインデックスを指定するにはどうすればよいですか? SQLを実行した後で値が分離されるためです。たとえば、SQL文を実行した後、最初の3つの項目はそれらを一緒に保存するリストでなければなりません。コメントのコードを書式設定できないため、コンテンツを編集します。 @ dmi3kno – hahakwok

+0

あなたが何を意味しているかわかりません。あなたは、質問を再記述しようと思いますか? – dmi3kno

+0

質問を編集する方法を考えているので、私は遅れて申し訳ありませんが、質問を編集します。各SQL文をデータフレームにしてリストを作成できますか? 2dのリストですか?私は初心者です。 @ dmi3kno – hahakwok