Сопоставьте строковый шаблон в именах столбцов через цикл и добавьте новый столбец в фрейм данных - PullRequest
0 голосов
/ 04 июня 2018

У меня есть фрейм данных с именами столбцов, такими как:

abc_alpha = c(1,2,3,4)
abc_beta = c(5,6,7,8)
abc_char = c(9,10,11,12)
xyz_alpha = c(4,3,2,1)
xyz_beta = c(8,7,6,5)
xyz_char = c(12,11,10,9)

и мой фрейм данных (df):

abc_alpha  abc_beta  abc_char  xyz_alpha  xyz_beta  xyz_char
   1          5         9         4          8         12
   2          6         10        3          7         11
   3          7         11        2          6         10
   4          8         12        1          5         9

Я хотел бы перебрать столбцы и сопоставитьстолбцы с одинаковым концом строк (после подчеркивания), взять среднее из двух совпадающих столбцов и добавить его в конец фрейма данных в качестве новой переменной (имя столбца для новой переменной будет соответствовать строке посленижнее подчеркивание).Я бы хотел использовать цикл вместо жесткого кодирования имен столбцов, поскольку в реальном наборе данных слишком много столбцов.

Ожидаемый результат будет:

abc_alpha abc_beta abc_char xyz_alpha xyz_beta xyz_char alpha beta char
   1         5        9        4         8       12      2.5  6.5  10.5
   2         6        10       3         7       11      2.5  6.5  10.5
   3         7        11       2         6       10      2.5  6.5  10.5
   4         8        12       1         5       9       2.5  6.5  10.5

Я написал первую часть функции цикла, но, кажется, не могу закончить, добавив новые столбцы в фрейм данных:

for (i in 1:ncol(df)) {

  x <- (strsplit(names(df)[i], split = '_', fixed = T))[[1]][2]

Я просмотрел, возможно, похожие вопросы, но, поскольку я новичок в R, многие ответы, которые предлагают использовать семейство Apply, привели меня в замешательство, и я не смог адаптировать эти решения к своемуситуация.

Спасибо!

1 Ответ

0 голосов
/ 04 июня 2018

Мы можем split данных с помощью переменной группировки, созданной путем удаления подстроки и получить rowMeans

cbind(df, sapply(split.default(df, sub(".*_", "", names(df))), rowMeans))
#abc_alpha abc_beta abc_char xyz_alpha xyz_beta xyz_char alpha beta char
#1         1        5        9         4        8       12   2.5  6.5 10.5
#2         2        6       10         3        7       11   2.5  6.5 10.5
#3         3        7       11         2        6       10   2.5  6.5 10.5
#4         4        8       12         1        5        9   2.5  6.5 10.5

Или используя tidyverse, gather столбцы в 'длинный формат, затем separate столбец «ключ» в два столбца через разделитель _, summarise, чтобы получить mean после группировки по именам строк и ширине от 'key2', spread до 'wide'и связать с исходным набором данных, используя `bind_cols'

library(tidyverse)
df %>% 
  rownames_to_column('rn') %>% # create a rowname column
  gather(key, val, -rn) %>% # convert to long format
  separate(key, into = c('key1', 'key2')) %>% # split column into two
  group_by(rn, key2) %>% # grouping with columns
  summarise(val = mean(val)) %>% # get the mean 
  spread(key2, val) %>% # convert to wide format
  ungroup %>% # remove the groups
  select(-rn) %>% # select only columns of interest
  bind_cols(df, .) # bind with the original dataset
# abc_alpha abc_beta abc_char xyz_alpha xyz_beta xyz_char alpha beta char
#1         1        5        9         4        8       12   2.5  6.5 10.5
#2         2        6       10         3        7       11   2.5  6.5 10.5
#3         3        7       11         2        6       10   2.5  6.5 10.5
#4         4        8       12         1        5        9   2.5  6.5 10.5

data

df <- data.frame(abc_alpha, abc_beta, abc_char, xyz_alpha, xyz_beta, xyz_char)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...