Цикл по столбцам в фрейме R - PullRequest
0 голосов
/ 21 января 2019

Я хочу перебрать определенные столбцы во фрейме данных и создать новые столбцы

У меня есть фрейм данных, который выглядит следующим образом:

  a   b  c d
2.8   A  A T    
1.9   T  G T 
1.7   G  G A 
2.3   T  T G

Я хотел бы вывод, подобный этому:

a    b  c   c_1   d d_1
2.8  A  A   2.8   T  0 
1.9. T  G   0     T  1.9 
1.7  G  G   1.7   A  0
2.3  T  T   2.3   G  0
1.2  C  G   0     C  1.2

По сути, он создает новый столбец c_1 или d_1 со значением, равным a, если буква в c или d такая же, как в b, и равно нулю, если буква отличается.

Я могу сделать это только для одного столбца:

df$c_1 <-ifelse(df$c==df$b,df$a,0)

Однако у меня есть много столбцов (около 100), как это сделать для всех столбцов?

1 Ответ

0 голосов
/ 21 января 2019

Использование dplyr (dd - имя кадра данных):

bind_cols(dd,transmute_at(dd, 3:4, ~ifelse(.==dd$b, dd$a,0)))

Transmute создает фрейм данных только с новыми столбцами. 3:4 - это то место, где я выбираю, какие столбцы будут изменены - в данном случае просто указав вектор их индексов. Наконец, bind_cols - это вариант dplyr для cbind, который переименовывает новые столбцы, чтобы избежать дублирования.

Результат:

    a b c d  c1  d1
1 2.8 A A T 2.8 0.0
2 1.9 T G T 0.0 1.9
3 1.7 G G A 1.7 0.0
4 2.3 T T G 2.3 0.0

Если вы хотите, чтобы столбцы были отсортированы, как в вашем примере, вы можете добавить это:

%>% .[,sort(names(.))]

Что даст вам:

    a b c  c1 d  d1
1 2.8 A A 2.8 T 0.0
2 1.9 T G 0.0 T 1.9
3 1.7 G G 1.7 A 0.0
4 2.3 T T 2.3 G 0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...