Сгруппируйте фрейм данных, используя строку в r - PullRequest
0 голосов
/ 13 января 2019

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

Client  A  A  A  A  A  B  B  B  B  B
Figure 33 45 66 77 88 99 55 66 55 22

Я хотел бы разделить фрейм данных на Client так, чтобы результирующий фрейм данных был следующим:

Client  A  A  A  A  A
Figure 33 45 66 77 88

Client  B  B  B  B  B
Figure 99 55 66 55 22

Я пытался использовать data <- split( df , f = df$Client ), но для этого требуется, чтобы данные были вертикальными, а не горизонтальными, и результатом будет список, а не фрейм данных. Я хотел бы, чтобы окончательные группы данных, разделенных клиентом, были ниже друг друга, как я указал, и чтобы это был фрейм данных, так что я смогу экспортировать его в Excel, как он есть

Ответы [ 4 ]

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

Аналогично ответу Павла Шаброса, но объединение результирующих элементов списка в матрицу по запросу:

df %>%
  t() %>%
  as_tibble() %>%
  split(.$Client) %>%
  map(t) %>% 
  reduce(rbind)
0 голосов
/ 13 января 2019

Вот решение base

clientVec <- unique(df['client',])
# with lapply
out <- lapply(seq_along(clientVec), function (k) df[,df['client',] == clientVec[k]])
out
# [[1]]
#        [,1] [,2] [,3] [,4]
# client "A"  "A"  "A"  "A" 
# figure "36" "81" "47" "90"
# 
# [[2]]
#        [,1] [,2] [,3] [,4]
# client "B"  "B"  "B"  "B" 
# figure "95" "14" "58" "91"

Если вместо этого вам нужен фрейм данных, просто используйте do.call(rbind, ...)

do.call(rbind, out)
#        [,1] [,2] [,3] [,4]
# client "A"  "A"  "A"  "A" 
# figure "36" "81" "47" "90"
# client "B"  "B"  "B"  "B" 
# figure "95" "14" "58" "91"

с данными

set.seed(123)
df <- t(data.frame(client = rep(LETTERS[1:2],c(4L,4L)), figure = sample(10:100, 8L, replace = TRUE)))
#        [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# client "A"  "A"  "A"  "A"  "B"  "B"  "B"  "B" 
# figure "36" "81" "47" "90" "95" "14" "58" "91"
0 голосов
/ 13 января 2019

Еще одно базовое решение R. Мы можем разделить имя столбца вашего фрейма данных на основе строки Client, а затем использовать его для выбора столбцов из исходного фрейма данных. Окончательный результат в dat_list.

Хотя это может быть не связано, но я хочу отметить, что формат вашего фрейма данных необычен, поскольку все столбцы являются символами. Кажется, строка Client - это имя столбца вашего фрейма данных, но поскольку вы упомянули, что Client и Figure - это имена строк, а имена столбцов обычно не дублируются, строка Client не может быть столбцом имя.

dat_list <- lapply(split(names(dat), unlist(dat[1, ])), function(x) dat[, x])

dat_list
# $A
#        V1 V2 V3 V4 V5
# Client  A  A  A  A  A
# Figure 33 45 66 77 88
# 
# $B
#        V6 V7 V8 V9 V10
# Client  B  B  B  B   B
# Figure 99 55 66 55  22

ДАННЫЕ для данных

dat <- read.table(text = "A  A  A  A  A  B  B  B  B  B
33 45 66 77 88 99 55 66 55 22",
                  header = FALSE, stringsAsFactors = FALSE)

row.names(dat) <- c("Client", "Figure")
0 голосов
/ 13 января 2019

Проверьте это решение:

library(tidyverse)

df %>%
  t() %>%
  as_tibble() %>%
  split(.$V1) %>%
  map(t)
...