2017-02-07 5 views
3

У меня есть кадр данных со многими столбцами, и я хотел бы объединить столбцы, начатые в столбце 5. Я пытаюсь использовать apply для этого.Применить функцию для объединения столбцов

Кадр данных:

1 682333 191.858 191517119 C A C A A A C A A A  A A 
2 1862626 71.9275 56032940 A C C C A A A C A C A A 
3 11957134 155.78 150230950 B B B B A B A B A B A B 
4 2516482 51.2692 31496569 B A A A A A A A A A A A 
5 9378200 51.2798 31572927 A A B B B A A A A A B A 
6 2071534 52.1573 32824318 A B A B A B A B B B A B 
7 2074633 33.068 19035920 A A B A A A B A B A B A 
8 7856856 121.811 117540910 A A A A A A A A B A B A 
9 3741206 2.18574 2169864 A A A A A A A A A A A A 
10 4411364 12.5959 24191374 C C A C A C C C A C A C 

Выход:

1 682333 191.858 191517119 CA  CA  AA  CA  AA  AA 
2 1862626 71.9275 56032940 AC  CC  AA  AC  AC  AA 
3 11957134 155.78 150230950 BB  BB  AB  AB  AB  AB 
4 2516482 51.2692 31496569 BA  AA  AA  AA  AA  AA 
5 9378200 51.2798 31572927 AA  BB  BA  AA  AA  BA 
6 2071534 52.1573 32824318 AB  AB  AB  AB  BB  AB 
7 2074633 33.068 19035920 AA  BA  AA  BA  BA  BA 
8 7856856 121.811 117540910 AA  AA  AA  AA  BA  BA 
9 3741206 2.18574 2169864 AA  AA  AA  AA  AA  AA 
10 4411364 12.5959 24191374 CC  AC  AC  CC  AC  AC 

Я пытался так:

col <- apply(df[,-1:-4], 2, function(x) {paste(x,x+1,sep="")} 
df <- cbind(df[,1:4],col) 

Но есть ошибка:

Error in x + 1 : non-numeric argument to binary operator.

+0

'x + 1' не ссылается на индекс столбца. Вы буквально пытаетесь сделать «C» + 1', что логически не имеет смысла. 'apply (df, 2, ...)' также управляет вниз-столбцом, а не через страницу. – thelatemail

+1

Решение «Карта» ниже, вероятно, имеет больше смысла, но для адаптации кода, который вы использовали, попробуйте - 't (apply (df [, - (1: 4)], 1, function (x) paste0 (x [c (TRUE, FALSE)], x [c (FALSE, TRUE)]))) ' – thelatemail

ответ

1

Мы можем paste столбцов по Подменят чередующиеся столбцы, начиная с колонки 5, используя seq, преобразуйте в matrix, paste матрицы одинакового размера, назначьте выход обратно до половины числа столбцов, подмножите выбранные столбцы, чтобы создать новый набор данных

df1[5:10] <- paste(as.matrix(df1[seq(5, ncol(df1), by = 2)]), 
     as.matrix(df1[seq(6, ncol(df1), by = 2)]), sep="") 
df2 <- df1[1:10] 
1

Одним из подходов является замена нечетных столбцов кадра данных на cbind каждой пары столбцов, начиная с начала. Затем отбросьте исходные четные столбцы.

for (i in seq(1,ncol(df)-1,2) { 
    df[, i] <- cbind(df[, i], df[, i+1]) 
} 

df <- df[, seq(1,ncol(df),2)] 

Обратите внимание, что второе назначение выше сохранит непревзойденный нечетный столбец в конце фрейма данных, если оно произойдет. Например, если в кадре входных данных было 5 столбцов, мы бы объединили 1:2 и 3:4, а пятый столбец просто остался бы неизменным.

2

Вы можете использовать Map Переберите нечетные столбцы позиции и четных столбцы положения параллельно и вставьте соответствующий столбец вместе:

as.data.frame(c(df[1:4], Map(function(x, y) paste(x, y, sep = ""), 
          df[-(1:4)][c(TRUE, FALSE)],  # use cycling rule to pick 
                   # odd position columns 
          df[-(1:4)][c(FALSE, TRUE)]))) # pick even position columns 

# V1  V2  V3  V4 V5 V7 V9 V11 V13 V15 
#1 1 682333 191.85800 191517119 CA CA AA CA AA AA 
#2 2 1862626 71.92750 56032940 AC CC AA AC AC AA 
#3 3 11957134 155.78000 150230950 BB BB AB AB AB AB 
#4 4 2516482 51.26920 31496569 BA AA AA AA AA AA 
#5 5 9378200 51.27980 31572927 AA BB BA AA AA BA 
#6 6 2071534 52.15730 32824318 AB AB AB AB BB AB 
#7 7 2074633 33.06800 19035920 AA BA AA BA BA BA 
#8 8 7856856 121.81100 117540910 AA AA AA AA BA BA 
#9 9 3741206 2.18574 2169864 AA AA AA AA AA AA 
#10 10 4411364 12.59590 24191374 CC AC AC CC AC AC 
+1

Это можно немного упростить -' cbind (df [1: 4], Map (paste0, df [- (1: 4) ] [c (TRUE, FALSE)], df [- (1: 4)] [c (FALSE, TRUE)])) ' – thelatemail