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

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

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

set.seed(2312)
dragon <- sample(c(1),3,replace=TRUE)
Maine  <- sample(c("Maine"),3,replace=TRUE)
Maine1 <- data.frame(dragon, Maine)

dragon <- sample(c(0),20,replace=TRUE)
Maine  <- sample(c("Maine"),20,replace=TRUE)
Maine2 <- data.frame(dragon, Maine)

Maine2

library(dplyr)

maine3 <- bind_rows(Maine1, Maine2)

Есть ли лучший способ для создания этого набора данных, чем код выше?

Я пытаюсь создать фрейм данных из следующих данных:

+-------------+--------------+--------------+
|             | # of dragons | # no dragons |
+-------------+--------------+--------------+
| Maine       |            3 |            20|
| California  |            1 |            10|
| Jocko       |           28 |       110515 |
| Jessica Day |           17 |        26122 |
|             |           14 |        19655 |
+-------------+--------------+--------------+

И мне бы хотелось, чтобы это выглядело так:

+-----------------------+---------------+
|                       | Dragons (1/0) |
+-----------------------+---------------+
| Maine                 | 1             |
| Maine                 | 1             |
| Maine                 | 1             |
| Maine                 | 0             |
| Maine….(2:20)         | 0….           |
| California            | 1             |
| California….(2:10)    | 0…            |
| Ect..                 |               |
+-----------------------+---------------+

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

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Можно использовать tidyr::expand для расширения строк в желаемом формате.

Решение с использованием df, используемое @missuse, может быть показано как:

library(tidyverse)

df %>% gather(key,value,-names) %>%
  mutate(key = ifelse(key=="drag", 1, 0)) %>%
  group_by(names,key) %>%
  expand(value = 1:value) %>%
  select(names, value = key) %>%
  as.data.frame()

#     names value
# 1       A     0
# 2       A     0
# 3       A     1
# 4       A     1
# 5       A     1
# 6       A     1
# 7       A     1
# 8       A     1
# 9       A     1
# 10      A     1
# ...so on
# 117     E     1
# 118     E     1
# 119     E     1
# 120     E     1
# 121     E     1
# 122     E     1
0 голосов
/ 04 мая 2018

Я не совсем уверен, какое отношение имеет выборка к этой проблеме? Мне кажется, что вы ищете untable.

Вот пример

данные:

set.seed(1)
no_drag = sample(1:5, 5)
drag = sample(15:25, 5)
df <- data.frame(names =  LETTERS[1:5],
                 drag,
                 no_drag)

  names drag no_drag
1     A   24       2
2     B   25       5
3     C   20       4
4     D   23       3
5     E   15       1

library(reshape)
library(tidyverse)
df %>%
  gather(key, value, 2:3) %>% #convert to long format 
  {untable(.,num = .$value)} %>% #untable by value column
  mutate(value = ifelse(key == "drag", 0, 1)) %>% #convert values to 0/1
  select(-key) %>% #remove unwanted column
  arrange(names) #optional

#part of output
    names value
1       A     0
2       A     0
3       A     0
4       A     0
5       A     0
6       A     0
7       A     0
8       A     0
9       A     0
10      A     0
11      A     0
12      A     0
13      A     0
14      A     0
15      A     0
16      A     0
17      A     0
18      A     0
19      A     0
20      A     0
21      A     0
22      A     0
23      A     0
24      A     0
25      A     1
26      A     1
27      B     0
28      B     0
29      B     0
30      B     0

Есть и другие способы решения этой проблемы:

Один как @Frank, упомянутый в комментарии:

df %>%
  gather(key, val, 2:3) %>%
  mutate(v = Map(rep, key == "drag", val)) %>%
  unnest %>%
  select(-key, -val)

Другой:

df <- gather(df, key, value, 2:3) 
df <- df[rep(seq_len(nrow(df)), df$value), 1:2]
df$key[df$key == "drag"] <- FALSE
df$key[df$key != "drag"] <- TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...