2016-04-05 8 views
0

それぞれ3つの変数を持つ216個のデータフレームのリストがあります。例:リスト内の位置に応じてリスト内のデータフレーム列を条件付きでリネームする

df1 <- data.frame(A = 1:10, B= 11:20, C = 21:30) 
df2 <- data.frame(A = 31:40, B = 41:50, C = 51:60) 
listDF <- list(df1, df2) 

各データフレーム内の変数の名前を、リスト内のその位置に応じて順番に変更する必要があります。私ができること。たとえば:

#create lists of the variable names 
Bnames <- c("feel1", "feel2") 
Cnames <- c("cat1", "cat2") 
#sequentially name each data frame's columns 
k <- 0 
for(i in 1:length(listDF)){ 
    k = k+1 
    names(listDF[[i]]) <- c("ID",Bnames[k],Cnames[k]) 
    } 
#I know people prefer lapply; I tend to switch back and forth depending on what I'm doing 

は私がいる問題は、216枚のデータフレームのリストに(24「猫」変数X 9変数= 216「を感じる」)ということで、私は「Bnames」のリストを必要とし、異なる速度で配列するための 'Cnames'。最初の9つのデータフレームにはC = cat1、B = feel1:9、次の9はC = cat2、B = feel1:9などが必要です。だから、私はBに沿って再帰的にシーケンスする必要があるが、9つのデータフレームごとにCに沿ってゆっくりとシーケンスする必要がある。 「A」はすべてのデータフレームで「ID」でなければなりません。

私は本当にこれを行う方法を失っています。事前に感謝の意を表します!

さらに、わかりやすいタイトルの提案があれば、喜んで変更します。

EDIT:

それは私が私が行っていたときに終わるしたい場所を知るのに役立つかもしれません。各IDは、データフレームの異なる数で存在し、そして最終的に私が欲しいのは、次の形式で1つのデータフレームにデータフレームを再形成し、マージすることです:

feel1.1は「feel1」を示す
ID feel1.1 feel1.2 ... feel2.1 feel2.2 
2 NA  4   NA  7 
3 2  1   6   3 

IDが "feel"と "cat"の特定の組み合わせを持たない場合、IDがcat1のfeel1値を持ちませんでしたがcat2のためにしました。 IDがあるとして列と同じ数の行

私の(悪い)ソリューション:

X <- listDF 
#create lists of the data frame numbers for each "feel" variable 
feel1 <- seq(1,216,by=9) 
feel2 <- seq(2,216,by=9) 
feel3 <- seq(3,216,by=9) 
feel4 <- seq(4,216,by=9) 
feel5 <- seq(5,216,by=9) 
feel6 <- seq(6,216,by=9) 
feel7 <- seq(7,216,by=9) 
feel8 <- seq(8,216,by=9) 
feel9 <- seq(9,216,by=9) 

#assign correct names for the "feel" variables in each data frame 
for(i in 1:length(X)){ 
    if(i %in% feel1){ 
    names(X[[i]]) <- c("UniqueID", "cat", "feel1") 
    } 
    if(i %in% feel2){ 
    names(X[[i]]) <- c("UniqueID", "cat", "feel2") 
    } 
    if(i %in% feel3){ 
    names(X[[i]]) <- c("UniqueID", "cat", "feel3") 
    } 
    if(i %in% feel4){ 
    names(X[[i]]) <- c("UniqueID", "cat", "feel4") 
    } 
    if(i %in% feel5){ 
    names(X[[i]]) <- c("UniqueID", "cat", "feel5") 
    } 
    if(i %in% feel6){ 
    names(X[[i]]) <- c("UniqueID", "cat", "feel6") 
    } 
    if(i %in% feel7){ 
    names(X[[i]]) <- c("UniqueID", "cat", "feel7") 
    } 
    if(i %in% feel8){ 
    names(X[[i]]) <- c("UniqueID", "cat", "feel8") 
    } 
    if(i %in% feel9){ 
    names(X[[i]]) <- c("UniqueID", "cat", "feel9") 
    } 
} 

#'melt' each of the dataframes and then remove the rows with 'cat' 
X <- lapply(X, function(x) melt(x, id.vars ="UniqueID")) 
X <- lapply(X, function(x) subset(x, variable != "cat")) 

#add the appropriate 'cat' number to each 'feel' name 
for(j in 1:length(X)){ 
    if(j <= 9){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".24") 
    } 
    if(j > 9 & j <= 18){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".1") 
    } 
    if(j > 18 & j <= 27){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".2") 
    } 
    if(j > 27 & j <= 36){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".3") 
    } 
    if(j > 36 & j <= 45){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".4") 
    } 
    if(j > 45 & j <= 54){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".5") 
    } 
    if(j > 54 & j <= 63){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".6") 
    } 
    if(j > 63 & j <= 72){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".7") 
    } 
    if(j > 72 & j <= 81){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".8") 
    } 
    if(j > 81 & j <= 90){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".9") 
    } 
    if(j > 90 & j <= 99){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".10") 
    } 
    if(j > 99 & j <= 108){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".11") 
    } 
    if(j > 108 & j <= 117){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".12") 
    } 
    if(j > 117 & j <= 126){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".13") 
    } 
    if(j > 126 & j <= 135){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".14") 
    } 
    if(j > 135 & j <= 144){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".15") 
    } 
    if(j > 144 & j <= 153){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".16") 
    } 
    if(j > 153 & j <= 162){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".17") 
    } 
    if(j > 162 & j <= 171){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".18") 
    } 
    if(j > 171 & j <= 180){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".19") 
    } 
    if(j > 180 & j <= 189){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".20") 
    } 
    if(j > 189 & j <= 198){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".21") 
    } 
    if(j > 198 & j <= 207){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".22") 
    } 
    if(j > 207 & j <= 216){ 
    X[[j]]$variable <- paste0(X[[j]]$variable, ".23") 
    } 
} 

#reshape each data frame into 2 columns: ID and the renamed 'feel' variable 
X <- lapply(X, function(x) dcast(x, UniqueID ~ variable)) 

#merge it back onto the original dataset 
for(i in 1:length(X)){ 
    data <- merge(data, X[[i]], by="UniqueID", all=T) 
} 
+0

あなたは 'library(data.table);することができます。 rbindlist(dfList、idcol = TRUE) 'を呼び出すと、データをスタックし、リスト内の順序に基づいて' .id'という列を作成します。そこから、 '.id'で条件を設定できます(名前を変更する必要はありません)。 – Frank

答えて

0

私はこれらをすべてリスト要素変数と組み合わせて、長いものから長いものに変更します。今度は、リスト要素の中の多くの名前リストの代わりに、変数名の1セットを文字列のリスト(または文字列ベクトル、私は正確ではない)として変更する必要があります。

# sample data 
df1 <- data.frame(A = 1:10, B= 11:20, C = 21:30) 
df2 <- data.frame(A = 5:14, B = 41:50, C = 51:60) 
listDF <- list(df1, df2) 

require(reshape) 
require(plyr) 

# put them all in 1 long dataframe 
df <- rbind.fill(listDF) 

# label which list element they came from and pretty up the vars 
df$listnum <- rep((1:length(listDF)),times = lapply(listDF,nrow)) 
names(df) <- c('id','cat','feel','listnum') 

# change from long to wide 
df <- reshape(df,idvar = 'id',timevar = 'listnum',direction = 'wide') 

私はあなたの変数の命名されているかを正確にわからないんだけど、上記の結果は、あなたがそれに必要なすべての情報を持っています。ちょうどnames(df) <- sub()をする必要があります。また、異なるレートで循環するには、Rに短いベクトルをリサイクルさせます。何かが好きです:

paste(rep(1:24,each = 9),1:9,sep = '.') 
関連する問題