正确使用点差功能

时间:2019-08-07 13:43:13

标签: r tidyr

我的数据“ IDrel”具有三个变量,“ ID”,“类别”和“值”,看起来像这样:

    ID  category value
1       AU: Duflo, Esther
2   2   AF: MIT
3   3   SO: American Economic Journal: Applied Economics, 2(2), April 2010, pp.
4   4   IS: 1945-7782
5   5   AV: http://www.aeaweb.org/aej-applied/
6   6   DT: Journal Article
7   7   PY: 2010
8   8   AN: 1094392
9   9   TI: Prize Structure and Information in Tournaments: Experimental Evidence
10  10  AU: Freeman, Richard B.; Gelber, Alexander M.
11  11  AF: NBER; NBER
12  12  SO: American Economic Journal: Applied Economics, 2

“类别”有9个唯一值,我想将它们中的每一个都变成自己的变量,并用“值”-变量表示值。从理论上讲,这应该将变量的数量增加到11,并将观察值的数量减少9/10。

所需的输出看起来像这样:

ID    AU:            SO.                           IS:          [more variables]

    1     Duflo, Esther   American Economic Journal    1945-7782    [more values]
    2     Freeman, Richard American Economic Journal:  [...]     

我尝试通过传播功能实现这一目标:

IDspread<-spread(IDrel, category, value)

我实际上得到了11个变量,但是得到的观察值却相同。结果对我来说似乎是荒谬的,这些是前十个观察结果:

IS:  PY:
1      <NA> <NA>
2      <NA> <NA>
3      <NA> <NA>
4 1945-7782 <NA>

我正确使用此功能吗?有其他选择吗?

我意识到ID变量不能反映哪个类别/值属于哪个观察值,但是我需要对数据重新排序,以便为每个观察值“获取”正确的索引^^

2 个答案:

答案 0 :(得分:2)

问题是使用ID变量。它具有独特的价值。因此,如果我们在执行spread时保留该变量,则spread输出中的行数将等于'ID'中唯一元素的数,而不存在的组合将为{ {1}}。删除“ ID”,创建一个按“类别”分组的序列列(以处理重复项),然后NA

spread

数据

library(dplyr)
library(tidyr)
IDrel %>%        
   group_by(category) %>% 
   mutate(ID = row_number()) %>% # update the ID column
   spread(category, value)
# A tibble: 2 x 10
#    ID `AF:`    `AN:`  `AU:`                `AV:`             `DT:`     `IS:`  `PY:` `SO:`                          `TI:`                         
#  <int> <chr>    <chr>  <chr>                <chr>             <chr>     <chr>  <chr> <chr>                          <chr>                         
#1     1 MIT      10943… Duflo, Esther        http://www.aeawe… Journal … 1945-… 2010  American Economic Journal: Ap… Prize Structure and Informati…
#2     2 NBER; N… <NA>   Freeman, Richard B.… <NA>              <NA>      <NA>   <NA>  American Economic Journal: Ap… <NA>   

答案 1 :(得分:1)

这不是spread()上问题的直接答案,但数据看起来非常类似于DCF格式。

DCF是一种用于将数据库存储为纯文本文件的简单格式,可以使用基数R的read.dcf()函数直接从文件中读取。

因此,如果数据将存储在文件IDrel.dcf

AU: Duflo, Esther
AF: MIT
SO: American Economic Journal: Applied Economics, 2(2), April 2010, pp.
IS: 1945-7782
AV: http://www.aeaweb.org/aej-applied/
DT: Journal Article
PY: 2010
AN: 1094392
TI: Prize Structure and Information in Tournaments: Experimental Evidence

AU: Freeman, Richard B.; Gelber, Alexander M.
AF: NBER; NBER
SO: American Economic Journal: Applied Economics, 2

命令

read.dcf("IDrel.dcf", all = TRUE)

将返回data.frame

                                         AU         AF                                                                  SO        IS
1                             Duflo, Esther        MIT American Economic Journal: Applied Economics, 2(2), April 2010, pp. 1945-7782
2 Freeman, Richard B.; Gelber, Alexander M. NBER; NBER                     American Economic Journal: Applied Economics, 2      <NA>
                                  AV              DT   PY      AN                                                                    TI
1 http://www.aeaweb.org/aej-applied/ Journal Article 2010 1094392 Prize Structure and Information in Tournaments: Experimental Evidence
2                               <NA>            <NA> <NA>    <NA>

请注意,空行表示新记录的开始。

在帮助文件DCF中解释了R中实现的?read.dcf规则。