Как объединить строки с конкретными именами в R - PullRequest
0 голосов
/ 15 апреля 2019

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

                     v1     v2     v3    v4
  Number              1     2      3     5
  Index               0     0      0     0
  Number.1            1     2      3     5
  Index.1             0     0      0     0
  Number.2            1     2      3     5
  Index.2             0     0      0     0
  Number.3            1     2      3     5
  Index.3             0     0      0     0
  Number.4            1     2      3     5
  Index.4             0     0      0     0
  Number.5            1     2      3     5
  Index.5             0     0      0     0

Я хочу добавить все строки, которые имеют «Number», как одну строку значений, каждая в одном отдельном столбце

                      v1     v2     v3   v4    v5     v6     v7    v8
  Number              1     2      3     5      1     2      3     5   etc

Я не нашел простого способа сделать это, хотя это кажется простым. Я попытался с dplyr, как это безуспешно:

  df[,rownames(df)%in%(grep("Number*", rownames(df))]

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вот довольно запутанное dplyr решение - объяснение в комментариях.

library(tidyverse)

df2 <- df %>%
  mutate(row_name = rownames(.)) %>% # Add a new column with the row names
  filter(grepl("Number", row_name)) %>% # filter against a match for 'Number'
  select(-row_name) %>% # Get rid of that column
  t() %>% # Transpose
  map(unlist, use.names = F) %>% # Flatten
  as.data.frame() %>% # Convert to a df so we can change the row name later
  `colnames<-`(paste0("v", seq(1:ncol(.)))) %>%  # Add colnames to your format
  `rownames<-`("Number") # Add the row name

Результат:

       v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18
Number  1  2  3  1  2  3  1  2  3   1   2   3   1   2   3   1   2   3
1 голос
/ 15 апреля 2019

Мы берем транспонирование и объединение (c), чтобы получить vector

i1 <-  rownames(df)%in%(grep("Number(\\.\\d)*", rownames(df), value = TRUE))
v1 <- c(t(df[i1, ]))

ПРИМЕЧАНИЕ: grep возвращает индекс, поэтому нет необходимости снова делать %in% длясовпадения с именами строк

i2 <- grep("Number(\\.\\d)*", rownames(df))

будет достаточно для подмножества

v2 <- c(t(df[i2, ]))

Лучше иметь его как вектор, а не как data.frame.Если нам действительно нужна одна строка data.frame с таким количеством столбцов

as.data.frame.list(v1)

ПРИМЕЧАНИЕ 2. Слегка измените шаблон, чтобы он соответствовал ., за которым следовала цифра, если таковая имеется.В коде ОП он будет проверять Number*, т. Е. 0 или более 'r' (хотя в данных это работает)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...