从计数数据生成数据框架

3
我正在尝试从一份计数数据的数据帧中创建一个未汇总的数据帧。
我有一些经验在创建样本数据集方面,但是我在尝试获取每个州/人的特定行数和比例时遇到了一些麻烦,而不是分别对它们进行编码,然后将它们组合起来。 我能够使用以下代码完成此操作,但我感觉还有更好的方法。
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..                 |               |
+-----------------------+---------------+

我不希望你替我写代码,但非常希望能得到有用的函数或示例想法。

1
顺便提一下,您没有为“从以下计数数据”表提供可重现的代码。也许一个类似的快捷方式是使用tidyr加载maine3 %>% count(Maine, dragon) %>% spread(dragon, n) - Frank
2个回答

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

2

可以使用 tidyr::expand 来以所需格式扩展行。

使用 @missuse 提供的 df 的解决方案如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接