2016-08-21 7 views
2

私はデータフレームのリストを持っており、すべての観測で新しい変数の値としてベクトルの対応する要素を追加しようとしているリストの各データフレームに割り当てる。データフレームのリストに新しい列を追加するが、ベクトルの1行だけを選択する

私の質問には次のようなものがあります:「インデックス」には、今のところどのようなステップが実行されているのかを記録していますか?私はこれで何かを見つけることができませんでしたが、私はループが必要ではないので、私が信じている私の問題を解決するだろうtimevar <- time[magic.index]私は例が私が意味するものがはるかに明確になりますと思う。

#list of data frames 
df1 <- data.frame("Var1" = c(1:10)) 
df2 <- data.frame("Var1" = c(1:10),"Var2" = c(1:10)) 
df3 <- data.frame("Var1" = c(1:10),"Var2" = c(1:10),"Var3" = c(1:10)) 
dfs <- list(df1,df3,df2) 

time <- c(1,2,1) 

#this is what I want to do with lapply 
lapply(dfs, function(x) within(x, timevar <- 1)) 

dfs2 <- for (i in seq_along(dfs)){ 
lapply(dfs, function(x) within(x, timevar <- time)) 
} 

#this is what the result should look like 
dfs[[1]] <- within(dfs[[1]], timevar <- 1) 
dfs[[2]] <- within(dfs[[2]], timevar <- 2) 
dfs[[3]] <- within(dfs[[3]], timevar <- 1) 
dfs 
+0

注有用であり得ます。 – gung

答えて

1

我々は、「時間」のベクトルの要素と「DFS」に対応list要素をINGのcbindによって「timevar」列を作成するMapを使用することができます。 purrrから


我々はhadleyverseを使用している場合

Map(cbind, dfs, timevar = time) 
#[[1]] 
# Var1 timevar 
#1  1  1 
#2  2  1 
#3  3  1 
#4  4  1 
#5  5  1 
#6  6  1 
#7  7  1 
#8  8  1 
#9  9  1 
#10 10  1 

#[[2]] 
# Var1 Var2 Var3 timevar 
#1  1 1 1  2 
#2  2 2 2  2 
#3  3 3 3  2 
#4  4 4 4  2 
#5  5 5 5  2 
#6  6 6 6  2 
#7  7 7 7  2 
#8  8 8 8  2 
#9  9 9 9  2 
#10 10 10 10  2 

#[[3]] 
# Var1 Var2 timevar 
#1  1 1  1 
#2  2 2  1 
#3  3 3  1 
#4  4 4  1 
#5  5 5  1 
#6  6 6  1 
#7  7 7  1 
#8  8 8  1 
#9  9 9  1 
#10 10 10  1 
map2は `lapply()` *ループであることだけでなく、

library(purrr) 
dfs %>% 
    map2(time, ~cbind(.x, timevar=.y)) 
+0

私の例でも魅力的なように働いていましたが、data.frame(...、check.names = FALSE)エラー: 引数の行数の差が21、23です。この '> str(時間)から生じる。 'data.frame':\t 23 obs。 1変数: $ time:int 2 1 2 1 2 1 1 2 2 2 ... > str(dfs [[1]]) 'data.frame':\t 21 obs。 188の変数のうち、「しかし、私の理解から、彼らは同じ長さである必要はありませんか? – Susu

+0

@Susu 'time'の長さに等しい 'dfs'の 'length'を持っていますか? Data.farmeとして '時間'があるように見えるので、 'Map(cbind、dfs、timevar = time $ time)'を使用してください。 – akrun

+1

あなたはそれを持っています! 'length(time)'は実際には1でした。 't(time)'を使用した後、うまくいきました!どうもありがとうございます!編集: 'time $ time works'も同様です。 – Susu

1

この内容はどうですか?

lapply(seq_len(length(dfs)),function(t) cbind(dfs[[t]],time[t])) 
+0

コメントをいただきありがとうございます。この例ではうまくいきました。私の実際のデータでは、 'data.frame(...、check.names = FALSE)のエラー: の引数は異なる行数を意味します:21,23'、' 23'は ''長さ ''' 「第1のデータフレームにおける観測数」である。なぜ私はそのエラーを得るが、それは時間から取られた価値がちょうど数字であるので私に意味をなさない? (データをよりよくマッチさせるためにサンプルを編集しようとしましたが、あなたのソリューションはまだそこで動作します)。何か案は? – Susu

+0

お手伝いいただきありがとうございます。 Akrunは既にそれを解決していますので、あなたはそれについて考える必要はありません。 – Susu

関連する問題