Сводные группы значений строк в столбцы в R - PullRequest
0 голосов
/ 09 мая 2020

У меня есть такой фрейм данных в R (столбцы C1 и C2):

C1 C2
1 A
1 H
1 C
2 D
2 R
2 G
3 Z
3 L
3 M

Я бы хотел, чтобы это было так:

1 2 3
ADZ
HRL
C GM

Ни один из вариантов, которые я пробовал, не дает мне такой раскладки. Ценю вашу помощь.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Может быть, это может быть полезно:

X <- c(1,1,1,2,2,2,3,3,3)
Y <- c("A","H","C","D","R","G","Z","L","M")
DF <- data.frame(C1=X, C2=Y)
DF

$$ C1 \, C2 \ 1 \, A \ 1 \, H \ 1 \, C \ 2 \, D \\ 2 \, R \\ 2 \, G \\ 3 \, Z \\ 3 \, L \\ 3 \, M \\ $$

t <- NULL 
for (i in 1:max(X)){
t[[i]] <-   DF<span class="math-container">$C2[which(DF$</span>C1 %in% i)]
}

TDF <- data.frame("1"= t[[1]], "2" = t[[2]], "3" = t[[3]])
TDF

$$ X1 \ , X2 \, X3 \\ A \, D \, Z \\ H \, R \, L \\ C \, G \, M \\ $$

0 голосов
/ 09 мая 2020

Добро пожаловать в Stackexchange. Я думаю, что это действительно более правильный вопрос для Stackoverflow, потому что это вопрос программирования, а не вопрос статистики.

Однако я немного помогу.

Прежде всего, ваш вопрос , как указано, не имеет решения, потому что вы не можете использовать целые числа в качестве имен столбцов.

Но, что более важно, то, что вы хотите сделать, на самом деле не имеет смысла с точки зрения «аккуратных» данных.

В аккуратных данных каждая строка должна представлять уникальное «наблюдение». Однако в исходном фрейме данных, который вы указываете, нет никакой связи между набором {A, D, Z}, а также другими строками в вашем целевом фрейме данных. Следовательно, no набор аккуратных операций будет соответствовать вашему желанию.

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

library(tidyverse)

df1 = data.frame(
  C1 = rep(c(1,2,3), each=3),
  C2 = LETTERS[1:9]
)

df1 %>%  spread(C1, C2)
#> Error: Each row of output must be identified by a unique combination of keys.
#> Keys are shared for 9 rows:
#> * 1, 2, 3
#> * 4, 5, 6
#> * 7, 8, 9

df2 = data.frame(
  C1 = rep(c(1,2,3), each=3),
  C2 = LETTERS[1:9],
  C3 = rep(c(1,2,3), times=3)
)

df2 %>% spread(C3, C2)
#>   C1 1 2 3
#> 1  1 A B C
#> 2  2 D E F
#> 3  3 G H I

Создано 2020-05-08 пакетом REPEX (v0.3.0)

...