2014-10-16 35 views
1

我有這樣如何用特定模式重複數據幀的行?

col1 col2 col3 col4 col5 
1  A  12  13  14 
2  B  87  56  44 
3  C  45  23  33 
4  D  56  87  56 

數據幀和矢量

c("E", "F", "G") 

我一定要得到這樣的事情:

col1 col2 col3 col4 col5 
1  A  12  13  14 
0  E  0  0  0 
0  F  0  0  0 
0  G  0  0  0 
2  B  87  56  44 
0  E  0  0  0 
0  F  0  0  0 
0  G  0  0  0 
3  C  45  23  33 
0  E  0  0  0 
0  F  0  0  0 
0  G  0  0  0 
4  D  56  87  56 
0  E  0  0  0 
0  F  0  0  0 
0  G  0  0  0 

我可以使用循環得到這個數據幀,但這將是乏味的。有沒有什麼簡潔的方法來實現這一目標?

在此先感謝。

回答

0

添加新行很簡單,但按您想要的方式對它們排序很棘手。您可以忽略sorting.vec如果最終順序並不重要:

txt = "col1 col2 col3 col4 col5 
1  A  12  13  14 
2  B  87  56  44 
3  C  45  23  33 
4  D  56  87  56" 

tmp <- read.table(text=txt, header=T, stringsAsFactors=F) 
v2 <- c("E", "F", "G") 

# add the mostly empty data 
tmp2 <- data.frame(col1=0, col2=rep(v2, nrow(tmp)), 
        col3=0, col4=0, col5=0) 

# encoding vector for sorting at the end (took some figuring out) 
sorting.vec <- 1000* c(1:nrow(tmp), rep(1:nrow(tmp), each=length(v2))) + 
       c(rep(0, nrow(tmp)), rep(1:length(v2), nrow(tmp))) 

# stack and sort apropriately 
final <- rbind(tmp, tmp2)[order(sorting.vec),] 
0

您可以嘗試以使用Map的序列。

df <- data.frame(col1 = 1:4, 
col2 = LETTERS[1:4], 
col3 = c(12,87,45,56), 
col4=c(13,56,23,87), 
col5=c(14,44,33,56)) 

vec <- c("E","F","G") 

df2 <- data.frame(col1 = 0, col2 = vec, col3=0, col4=0, col5=0) 

#rbind 
df3 <- rbind(df2, df) 

#generate new sequence for rows 
df4<-df3[unlist(Map(c, (nrow(df2)+1):nrow(df3), list(1:nrow(df2)))),] 
2

以下是使用行索引的可能(矢量化)解決方案。假設你的數據稱爲df和你的載體稱爲V,可以嘗試

df2 <- df[rep(seq_len(nrow(df)), each = length(V) + 1), ] 
df2[grep("[.]", row.names(df2)), ] <- 0 
df2[grep("[.]", row.names(df2)), "col2"] <- V 
# row.names(df2) <- seq_len(nrow(df2)) # Optional, if you don't like your row names 
df2 
# col1 col2 col3 col4 col5 
# 1  1 A 12 13 14 
# 2  0 E 0 0 0 
# 3  0 F 0 0 0 
# 4  0 G 0 0 0 
# 5  2 B 87 56 44 
# 6  0 E 0 0 0 
# 7  0 F 0 0 0 
# 8  0 G 0 0 0 
# 9  3 C 45 23 33 
# 10 0 E 0 0 0 
# 11 0 F 0 0 0 
# 12 0 G 0 0 0 
# 13 4 D 56 87 56 
# 14 0 E 0 0 0 
# 15 0 F 0 0 0 
# 16 0 G 0 0 0 
+1

一個側面說明,需要在stringsAsFactors = F切換,否則可以具有警告消息: 在'[< - factor'('* TMP *',ISEQ,值= C(0,0, 0,0,0,0,0,: 無效因子水平,產生的NA – KFB 2014-10-16 21:49:07

+0

@KFB,是的,你是對的我有這個自動化,所以完全忘了它 – 2014-10-16 21:54:46

0

您可以創建所需的表的結構,然後簡單地從原始數據框中指定的行。

df <- read.table(header=T, text=' 
       col1 col2 col3 col4 col5 
1  A  12  13  14 
2  B  87  56  44 
3  C  45  23  33 
4  D  56  87  56') 

v1 <- c(levels(df$col2)) 
v2 <- c(LETTERS[5:7]) 
new_df <- do.call("rbind", sapply(1:length(v1), FUN=function(x) expand.grid(0,c(v1[x],v2),0,0,0), simplify=F)) 

new_df[seq(from=1,to=nrow(new_df), by=4),] <- df 
colnames(new_df) <- colnames(df) 

    col1 col2 col3 col4 col5 
1  1 A 12 13 14 
2  0 E 0 0 0 
3  0 F 0 0 0 
4  0 G 0 0 0 
5  2 B 87 56 44 
6  0 E 0 0 0 
7  0 F 0 0 0 
8  0 G 0 0 0 
9  3 C 45 23 33 
10 0 E 0 0 0 
11 0 F 0 0 0 
12 0 G 0 0 0 
13 4 D 56 87 56 
14 0 E 0 0 0 
15 0 F 0 0 0 
16 0 G 0 0 0 
相關問題