3
df<-data.frame(w=c("r","q"), x=c("a","b"))
y=c(1,2)

df と y を、df の行と y の要素のすべての組み合わせを持つ新しいデータ フレームに結合するにはどうすればよいですか? この例では、出力は次のようになります。

data.frame(w=c("r","r","q","q"), x=c("a","a","b","b"),y=c(1,2,1,2))
  w x y
1 r a 1
2 r a 2
3 q b 1
4 q b 2
4

4 に答える 4

2

これは、あなたがやろうとしていることを、あまり手間をかけずに行う必要があります。

dl <- unclass(df)
dl$y <- y
merge(df, expand.grid(dl))
#   w x y
# 1 q b 1
# 2 q b 2
# 3 r a 1
# 4 r a 2
于 2013-09-29T09:58:22.490 に答える
1
data.frame(lapply(df, rep, each = length(y)), y = y)
于 2013-09-29T10:54:50.310 に答える
0

これはうまくいくはずです

library(combinat)
df<-data.frame(w=c("r","q"), x=c("a","b"))
y=c("one", "two") #for generality
indices <- permn(seq_along(y))
combined <- NULL
for(i in indices){
  current <- cbind(df, y=y[unlist(i)])
  if(is.null(combined)){
    combined <- current 
  } else {
    combined <- rbind(combined, current)
  }
}
print(combined)

出力は次のとおりです。

      w x   y
    1 r a one
    2 q b two
    3 r a two
    4 q b one

...または短くする(そしてあまり目立たない):

combined <- do.call(rbind, lapply(indices, function(i){cbind(df, y=y[unlist(i)])}))
于 2013-09-29T05:00:21.150 に答える
0

まず、列のクラスを因子から文字に変換します。

df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE)

次に、 を使用して、 の行と要素のexpand.gridすべての組み合わせのインデックス行列を取得します。dfy

ind.mat = expand.grid(1:length(y), 1:nrow(df))

最後に、 の行をループしてind.mat結果を取得します。

data.frame(t(apply(ind.mat, 1, function(x){c(as.character(df[x[2], ]), y[x[1]])})))
于 2013-09-29T08:08:44.673 に答える