2017-07-11 10 views
2

こんにちはデータフレームをRからエクスポートしてAMPLで使用するために、特定のフォーマットに変換しようとしています。データフレームを部分集合化する代わりにプログラマチックに並べ替え

私の最初のdaraframeは、以下の

test <- structure(list(from = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), 
to = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3), beta = c(0.0214674078064637, 
0.0205966237172006, 0.0197611613089226, 0.0214674078064637, 
0.0205966237172006, 0.0197611613089226, 0.0214674078064637, 
0.0205966237172006, 0.0197611613089226, 0.0214674078064637, 
0.0205966237172006, 0.0197611613089226), Time = c(0L, 0L, 
0L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L)), class = "data.frame", row.names = c(NA, 
-12L), .Names = c("from", "to", "beta", "Time")) 

これは私の所望の最終結果はこの1つであるテストdata.frame

from to  beta Time 
1  1 1 0.02146741 0 
2  1 2 0.02059662 0 
3  1 3 0.01976116 0 
4  1 1 0.02146741 1 
5  1 2 0.02059662 1 
6  1 3 0.01976116 1 
7  1 1 0.02146741 2 
8  1 2 0.02059662 2 
9  1 3 0.01976116 2 
10 1 1 0.02146741 3 
11 1 2 0.02059662 3 
12 1 3 0.01976116 3 

である:私のやり方

 V T1   0 T2   1 T3   2 T4   3 line 
1 [1,1,*] 0 0.02146741 1 0.02146741 2 0.02146741 3 0.02146741 \n 
2 [1,2,*] 0 0.02059662 1 0.02059662 2 0.02059662 3 0.02059662 \n 
3 [1,3,*] 0 0.01976116 1 0.01976116 2 0.01976116 3 0.01976116 \n 

これは今のところこれです:

Betas <- unite_(test, col = "V", sep = ",", from = c("from", "to")) 
Betas <- spread(Betas, key = Time, value = beta) 
Betas$V <- paste("[", Betas$V, ",*]", sep = "") 
Betas$T1 <- 0 
Betas$T2 <- 1 
Betas$T3 <- 2 
Betas$T4 <- 3 
Betas <- Betas[,c(1,6,2,7,3,8,4,9,5)] 
Betas$line <- "\n" 

私はコード

Betas <- unite_(test, col = "V", sep = ",", from = c("from", "to")) 
Betas <- spread(Betas, key = Time, value = beta) 
Betas$V <- paste("[", Betas$V, ",*]", sep = "") 

の私の最初の3行のプロセスが好きしかし、私は怒鳴るラインを交換したいと思い、この理由は、時間列がX回繰り返すことができることです。今度はいつも0からXへ行くでしょう、私はプログラム的にXの値を知っていますか?

Betas$T1 <- 0 
Betas$T2 <- 1 
Betas$T3 <- 2 
Betas$T4 <- 3 
Betas <- Betas[,c(1,6,2,7,3,8,4,9,5)] 
Betas$line <- "\n" 

答えて

3

基本R溶液

temp = split(test, test$Time) 
do.call(cbind, lapply(1:length(temp), function(i){ 
    if (i == 1){ 
     setNames(data.frame(paste(temp[[i]][["from"]], ",", temp[[i]][["to"]], ",*", sep = ""), temp[[i]]["Time"], temp[[i]]["beta"]), 
       c("V", paste("T", i, sep = ""), i-1)) 
    } else if (i == length(temp)){ 
     setNames(data.frame(temp[[i]]["Time"], temp[[i]]["beta"], rep("\n", NROW(temp[[i]]))), 
       c(paste("T", i, sep = ""), i-1, "line")) 
    } else { 
     setNames(data.frame(temp[[i]]["Time"], temp[[i]]["beta"]), 
       c(paste("T", i, sep = ""), i-1)) 
    } 
})) 
#  V T1   0 T2   1 T3   2 T4   3 line 
#1 1,1,* 0 0.02146741 1 0.02146741 2 0.02146741 3 0.02146741 \n 
#2 1,2,* 0 0.02059662 1 0.02059662 2 0.02059662 3 0.02059662 \n 
#3 1,3,* 0 0.01976116 1 0.01976116 2 0.01976116 3 0.01976116 \n 
+1

おかげで、私はより多くの答えがあるかどうかだけをチェックするために時間のカップルを開くことを保持しますが、これは素晴らしい作品 –

0

tidyverseから溶液。 Betas2が最終出力です。ここで

# Load package 
library(tidyverse) 

# Create example data frame 
Betas <- unite_(test, col = "V", sep = ",", from = c("from", "to")) 
Betas <- spread(Betas, key = Time, value = beta) 
Betas$V <- paste("[", Betas$V, ",*]", sep = "") 

# A function to split the data frame 
split_df <- function(Begin, End, dt){ 
    dt2 <- dt %>% select(Begin, End) 
    return(dt2) 
} 

# A function to Add Time and values 
add_time <- function(dt) { 
    # Extract column names and value 
    Colname <- colnames(dt) 
    Value <- as.numeric(Colname[2]) 
    Value2 <- Value + 1 
    Value <- enquo(Value) 
    Value2 <- enquo(Value2) 
    Col <- paste0("T", quo_name(Value2)) 
    # Add column based on the Colname 
    dt2 <- dt %>% 
    mutate(!!Col := !!Value) %>% 
    select(1, 3, 2) 
    return(dt2) 
} 

# Apply functions 
dt_list <- map2(1, 2:ncol(Betas), .f = split_df, dt = Betas) 
dt_list2 <- map(dt_list, .f = add_time) 

# Merge all data frames 
Betas2 <- reduce(dt_list2, left_join, by = "V") %>% 
    # Create the line column 
    mutate(line = "\n") 
0

は私のテイクがあります:それは素晴らしい作品d.b @

library(dplyr) 
NR <- 3 
df <- as.data.frame(cbind(paste0("[1,", 1:NR , ",*]"), 
       matrix(test$beta,nrow=NR ), 
       matrix(test$Time,nrow=NR ), 
       rep("\n",NR ))) %>% 
     select(V1,V6,V2,V7,V3,V8,V4,V9,V5,V10) 

newnames <- c("V","T1","0","T2","1","T3","2","T4","3","line") 
colnames(df) <- newnames 
関連する問題