2015-02-05 3 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 представляют собой текст вместо цифр, есть способ сохранить и объединить их вместе вместо цифр. Если я применим это к моим фактическим данным, он просто сообщает о конкатенированных адресах. Спасибо –

+0

@JohnLapek похоже, что у вас на самом деле есть кадр данных с факторами вместо текста - см. Обновленный вопрос о том, как справиться с этим делом. Обычно я создаю кадры данных с помощью 'stringsAsFactors = F', чтобы избежать проблем с факторами во время перебора данных. – josliber

+0

спасибо! это сделало трюк. –

1

Я хотел бы внести дополнительные вклады, используя dplyr и data.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' фактически принимает в нем функцию. Я пытался преобразовать матрицу в вектор для каждого столбца в данных, но потом я застрял. Когда я увидел Дэвида, использующего «гребенку», эти идеи пришли мне в голову. – jazzurro

Смежные вопросы