2015-02-05 99 views
2

我有一个很大的data.frame,我想将列内的值连接在一起,然后用输出创建一个新的data.frame 。由于我的data.frame有近1700列,我认为最简单的方法是循环遍历列。以下是我想要做的一个例子。循环遍历data.frame中的列,并根据循环中的计算创建新的data.frame

初始值:

variable1 = c(var1, var2, var3) 
variable2 = c(var4, var5, var6) 
variable3 = c(var7, var8, var9) 
df = data.frame(variable1, variable2, variable3) 

预期输出:

variable1 variable2 variable3 
1 var1_var2 var4_var5 var7_var8 
2 var1_var3 var4_var6 var7_var9 
3 var2_var3 var5_var6 var8_var9 

我现在使用的代码是:

index = 1 
column = 1 

Complexes <- dim(df)[2] 
proteins <- dim(df)[1] 


complex <-list() 
interactions <- list() 
complexcol <- list() 

for(i in 1:Complexes){ 
    complex[[column]]=(for(j in 1:proteins){ 
    for(k in j+1:proteins){ 
     interactions[index] = c(paste0(corum[i,j],"_",corum[i,k])) 
     index = index +1 
    } 
    }) 
    column = column + 1 
    print(column) 
    index = 1 
} 

当我执行,它通过迭代列,但它不会在新列表或data.frame中生成输出。

谢谢!

回答

4

可以使用combn功能让所有的组合,使得这一操作的1班轮:

# Build example data 
(dat = data.frame(1:3, 4:6, 7:9)) 
# X1.3 X4.6 X7.9 
# 1 1 4 7 
# 2 2 5 8 
# 3 3 6 9 

# Get all combinations of rows 
t(apply(combn(nrow(dat), 2), 2, function(x) paste0(dat[x[1],], "_", dat[x[2],]))) 
#  [,1] [,2] [,3] 
# [1,] "1_2" "4_5" "7_8" 
# [2,] "1_3" "4_6" "7_9" 
# [3,] "2_3" "5_6" "8_9" 

如果你有一个数据帧存储因素,你想他们的水平结合起来,你可以将数据转换帧到一个实际存储的字符串,然后使用相同的代码

# Make data frame with factors 
(dat = data.frame(X=c("a", "b", "c"), Y=c("d", "e", "f"), Z=c("g", "h", "i"))) 
# X Y Z 
# 1 a d g 
# 2 b e h 
# 3 c f i 
str(dat) 
# 'data.frame': 3 obs. of 3 variables: 
# $ X: Factor w/ 3 levels "a","b","c": 1 2 3 
# $ Y: Factor w/ 3 levels "d","e","f": 1 2 3 
# $ Z: Factor w/ 3 levels "g","h","i": 1 2 3 

# Convert to data frame with strings and then use same code 
dat2 <- data.frame(lapply(dat, as.character), stringsAsFactors=F) 
t(apply(combn(nrow(dat2), 2), 2, function(x) paste0(dat2[x[1],], "_", dat2[x[2],]))) 
#  [,1] [,2] [,3] 
# [1,] "a_b" "d_e" "g_h" 
# [2,] "a_c" "d_f" "g_i" 
# [3,] "b_c" "e_f" "h_i" 
+0

如果data.frame中的值是文本而不是数字,有没有办法将这些值保留并连接在一起而不是数字。如果我将这个应用于我的实际数据,它只是汇报连在一起的地址。谢谢 – 2015-02-05 15:28:43

+0

@JohnLapek它听起来像你实际上有一个数据框与因素,而不是文本 - 看到更新的问题,如何处理这种情况。通常我使用'stringsAsFactors = F'创建数据框,以避免在数据争用期间处理因素。 – josliber 2015-02-05 15:37:31

+0

谢谢!这个伎俩。 – 2015-02-05 15:52:48

1

我想提出使用dplyrdata.table这里更多的捐款。受到@David Arenburg的启发,我得到以下结果。

df <- data.frame(variable1 = c("var1", "var2", "var3"), 
       variable2 = c("var4", "var5", "var6"), 
       variable3 = c("var7", "var8", "var9"), 
       stringsAsFactors = FALSE) 

library(dplyr) 
mutate_each(df, funs(combn(., 2, paste, collapse = "_"))) 

# variable1 variable2 variable3 
#1 var1_var2 var4_var5 var7_var8 
#2 var1_var3 var4_var6 var7_var9 
#3 var2_var3 var5_var6 var8_var9 

library(data.table) 
setDT(df)[, lapply(.SD, function(x) {combn(x, 2, paste, collapse = "_")})] 

# variable1 variable2 variable3 
#1: var1_var2 var4_var5 var7_var8 
#2: var1_var3 var4_var6 var7_var9 
#3: var2_var3 var5_var6 var8_var9 
+1

@akrun我不知道'combn'实际上需要一个函数。我试图将矩阵转换为数据中每列的向量,但后来我卡住了。当我看到大卫使用'combn'时,这些想法进入我的脑海。 – jazzurro 2015-02-10 05:29:20