-1

次のような多くのdata.frame属性を持つ複数の変数があります。

> df1
$ML1
  Q2 Q3
1  1  1
2  0  0
3  0  1
4  1  1
5  0  0

$ML2
  Q4 Q5
1  0  1
2  1  1
3  1  0
4  1  0
5  0  0

> df2
$ML2
   Q4 Q5
1   1  1
2   1  0
3   1  0
4   0  0
5   0  0
6   1  0
7   1  1
8   0  1
9   1  1
10  0  1

$ML1
   Q2 Q3
1   0  0
2   1  1
3   0  1
4   1  0
5   0  1
6   1  0
7   0  1
8   1  0
9   1  1
10  0  0

そして、これらを次のようなdata.framesを持つ変数に結合したいと思います。

> dfAll
$ML1
  Q2 Q3
1  1  1
2  0  0
3  0  1
4  1  1
5  0  0
6  0  0
7  1  1
8  0  1
9  1  0
10 0  1
11 1  0
12 0  1
13 1  0
14 1  1
15 0  0

$ML2
  Q4 Q5
1  0  1
2  1  1
3  1  0
4  1  0
5  0  0
6  1  1
7  1  0
8  1  0
9  0  0
10 0  0
11 1  0
12 1  1
13 0  1
14 1  1
15 0  1

私は試しrbind(df1, df2)ましたが、次のような変数が作成されます。

> rbind(df1, df2)[,"ML1"]
$df1
  Q2 Q3
1  1  1
2  0  0
3  0  1
4  1  1
5  0  0

$df2
   Q4 Q5
1   1  1
2   1  0
3   1  0
4   0  0
5   0  0
6   1  0
7   1  1
8   0  1
9   1  1
10  0  1

したがって、行は同じdata.frame内で互いに追加されません。

他に何をする必要がありますか?

4

3 に答える 3

2

これは、例のように、データフレームのすべてのリスト(df1、df2など)が一貫していることを前提としています。具体的には、df1に要素「foo」がある場合、df2にも要素「foo」があり、df1$fooであると想定しています。およびdf2$fooはrbind互換性のあるデータフレームです。

# create two sample lists of data.frames
df1 <- lapply(list(ML1=1:2, ML2=3:4), function(i) head(iris[i]))
df2 <- lapply(list(ML2=3:4, ML1=1:2), function(i) tail(iris[i]))
# store them in a list for easier reference
dfList <- list(df1, df2)
# for each data frame name, extract and rbind the corresponding data 
dfAll <- sapply(names(dfList[[1]]), function(col) do.call("rbind", 
    lapply(dfList, "[[", col)), simplify=FALSE)

これは精神的には他の回答と似ていますが、質問で提示されたように構造化された出力を生成します。

> dfAll
$ML1
    Sepal.Length Sepal.Width
1            5.1         3.5
2            4.9         3.0
3            4.7         3.2
4            4.6         3.1
5            5.0         3.6
6            5.4         3.9
145          6.7         3.3
146          6.7         3.0
147          6.3         2.5
148          6.5         3.0
149          6.2         3.4
150          5.9         3.0

$ML2
    Petal.Length Petal.Width
1            1.4         0.2
2            1.4         0.2
3            1.3         0.2
4            1.5         0.2
5            1.4         0.2
6            1.7         0.4
145          5.7         2.5
146          5.2         2.3
147          5.0         1.9
148          5.2         2.0
149          5.4         2.3
150          5.1         1.8

余談ですが、これがより大きなワークフローの一部であると仮定すると、可能であれば、データフレームがdfList個々の名前付きオブジェクトとして結合されるのではなく、最初からアセンブルされるようにアップストリームコードを変更します。

于 2013-03-03T17:12:34.370 に答える
1

最初に気付くのは、(見た目は)2つのdata.framesがないことです。あなたが持っているのは、それぞれが2つのdata.framesを含む2つのリストです。1つはML1という名前で、もう1つはML2という名前です。

#Example data for the purpose of being reproducible
df1 <- list(ML1=data.frame(Q2=1:5,Q3=LETTERS[1:5]),ML2=data.frame(Q4=6:10,Q5=LETTERS[6:10]))
df2 <- list(ML1=data.frame(Q2=11:15,Q3=LETTERS[11:15]),ML2=data.frame(Q4=16:24,Q5=LETTERS[16:24]))
# Lets look at the structure, just for educational purposes
str(df1)
str(df2)
# Okay, now how can we bind those lists together?  
# It turns out, we just use c because lists are really just vectors of type list.
list.all <- c(df1,df2)
# Now that all of the data is in one structure, we have hope.
# The rbindListsByName function does the heavy lifting.  
# Notice we couldn't just provide "nameToBind" otherwise it would just grab the first list with a matching name.  
#We needed a logical to pick out the lists we actually wanted.
rbindListsByName <- function(nameToBind,inputList) {
   do.call("rbind",inputList[names(inputList)==nameToBind])
}
dfAll <- sapply(names(df1),rbindListsByName,inputList=list.all,simplify=FALSE)
于 2013-03-03T16:23:19.210 に答える
-1

やってみます。しかし、あなたの質問はまだ再現できません。

#Here I try to recreate your objects:
ML1 <- read.table(text="Q2 Q3
1  1  1
2  0  0
3  0  1
4  1  1
5  0  0",header=TRUE)

ML2 <- read.table(text="Q4 Q5
1  0  1
2  1  1
3  1  0
4  1  0
5  0  0",header=TRUE)

df1 <- list(ML1=ML1,ML2=ML2)

ML2 <- read.table(text="Q4 Q5
1   1  1
2   1  0
3   1  0
4   0  0
5   0  0
6   1  0
7   1  1
8   0  1
9   1  1
10  0  1",header=TRUE)

ML1 <- read.table(text="Q2 Q3
1   0  0
2   1  1
3   0  1
4   1  0
5   0  1
6   1  0
7   0  1
8   1  0
9   1  1
10  0  0",header=TRUE)

df2 <- list(ML2=ML2,ML1=ML1)

ML1維持してML2分離する理由がわかりません。したがって、私はcbind彼らです。

#combine the lists in a list
mylist <- list(df1,df2)

#cbind the data.frames in each sublist
mylist <- lapply(mylist,function(x) do.call("cbind",x))
#rbind the resulting data.frames
do.call("rbind",mylist)

#   ML1.Q2 ML1.Q3 ML2.Q4 ML2.Q5
#1       1      1      0      1
#2       0      0      1      1
#3       0      1      1      0
#</snip>
于 2013-03-03T16:21:56.997 に答える