从计数数据生成数据帧

时间:2018-05-04 16:57:18

标签: r

我正在尝试从计数数据的数据框中创建一个未编号的数据帧。

我有一些经验creating sample datasets但是我在尝试为每个州/人获得特定数量的行和比例时遇到了一些麻烦,而没有分别对它们进行编码然后将它们组合起来。我能够使用以下代码完成它,但我觉得有更好的方法。

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 :(得分:4)

我不完全确定采样与此问题有什么关系? 在我看来,您正在寻找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

答案 1 :(得分:2)

可以使用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