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